شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

نمایش قسمتی از متن و پاراگراف با PHP

php-limit-word

انتخاب و نمایش قسمتی از متن و پاراگراف یکی از نیازهایی است که معمولا در طراحی امکانات صفحات وب کاربردهای زیادی دارد، به طور مثال برای ایجاد قابلیت پیش نمایش محتوای دریافت شده از پرس و جوهای دیتابیس، نمایش خلاصه متن و پاراگراف در فرم های وب، نمایش قسمتی از نتیجه در هنگام جستجو در مطالب سایت، محدود کردن نمایش محتوای در اختیار کاربران با سطح دسترسی های متفاوت و موارد مشابه دیگری این امکان مورد استفاده قرار می گیرد، خوشبختانه نمایش قسمتی از متن و پاراگراف بسته به شرایط و نیاز طراح سایت به چند شیوه مختلف چه از طریق برنامه نویسی PHP یا در هنگام اجرای پرس و جوهای دیتابیس با دستورات و توابع درونی MySQL قابل انجام است که در این آموزش در حد امکان به تفصیل هر کدام از این روش ها را بررسی می کنیم.

نمایش قسمتی از متن به صورت شمارش کلمه


یکی از روش های نمایش قسمتی از متن یا پاراگراف تعیین تعداد و میزان کلماتی است که قصد داریم در خروجی نمایش داده شوند، برای انجام این کار در PHP می توانیم از ترکیب سه تابع explode ، implode و array_splice استفاده کنیم که در نمونه کد زیر این سه تابع را در بدنه یک تابع و به ترتیب تعریف کرده ایم:
<?php
function limitWord($string, $limit){
    $words = explode(" ", $string);
    $output = implode(" ", array_splice($words, 0, $limit));
    return $output;
}
?>
برای فراخوانی تابع کافی است پاراگراف مورد نظر را در یک متغیر تعریف و متغیر را (به عنوان آرگیومنت اول) به همراه تعداد کلمات مورد نظر (به عنوان آرگیومنت دوم) و به صورت زیر فراخوانی کنیم:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
echo limitWord($string, 5);
?>
به این صورت با اجرای کدهای PHP در خروجی صفحه تنها 5 کلمه اول از مقادیر متغیر فرضی string را خواهیم داشت.
آموزش کاربردی پی اچ پی
توضیح:
- تابع explode با دریافت یک مقدار به عنوان جداکننده (در اینجا فضای خالی یا " ") از آرگیومنت اول، متن مورد نظر را که در آرگیومنت دوم تنظیم شده به صورت آرایه ای از کلمات تبدیل می کند (String to Array).
- در قسمت بعدی برنامه تابع implode مجددا عناصر آرایه را به رشته متنی تبدیل می کند (Array to String)، البته در اینجا استفاده از array_splice باعث می شود که تنها تعداد کلمات محدودی از متن مورد نظر به خروجی ارسال شوند که این تعداد در متغیر limit (آرگیومنت دوم) مشخص شده است.
نکته: برای محاسبه تعداد کلمات موجود در آرایه می توانیم از تابع sizeof یا count هم در PHP استفاده کنیم که ممکن است برای توسعه کد در شرایط متفاوت مورد نیاز باشد:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
$words = explode(" ", $string);
echo sizeof($words);
echo '<br>';
echo count($words);
?>
خروجی دستورات بالا به صورت زیر است:
11
11
به این شیوه می توانیم برنامه هوشمندتری داشته باشیم به فرض تنها اگر تعداد کلمات یک متن از مقادیر مورد نظرمان بیشتر بود قسمت array_splice اجرا شود و یا ایده های متنوع دیگری که ممکن است به ذهن برنامه نویس برسد.

نمایش قسمتی از متن به صورت شمارش حروف  


روش دیگر برای انتخاب و نمایش قسمتی از متن و پاراگراف، شمارش حروفی است که تمایل داریم به همان تعداد به خروجی ارسال شوند، برای انجام این کار می توانیم از تابع substr و برای حروف فارسی از mb_subsrt استفاده کنیم، به طور مثال در کد زیر تعداد 22 حرف اول از نمونه متنی که قبلا بررسی کردیم را با این روش استخراج کرده و به خروجی می فرستیم:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
echo mb_substr($string, 0, 22, mb_detect_encoding($string));
?>
خروجی نمونه کد بالا به صورت زیر خواهد بود:
آموزش کاربردی پی اچ پی
در حال حاضر تابع substr تنها از استاندارد ASCII پشتیبانی می کند و برای کلمات فارسی که از استاندارد UTF-8 پیروی می کنند چندان کاربردی نیست چون هر حرف فارسی در تابع substr دو کاراکتر (Multibyte) حساب شده و به همین دلیل گاهی مواقع خروجی ناقص و غیر استاندارد در انتهای متن مورد نظر چاپ می شود، به فرض:
آموزش کاربر�
همان طور که گفتیم این موضوع مربوط به ساز و کار یونیکد زبان فارسی است که هر حرف متشکل از دو بایت است اما تابع substr حروف را بر اساس شمارش هر بایت تجزیه می کند و این منجر به بروز مشکل می شود، برای رفع مشکل بهتر است از تابع mb_substr و mb_detect_encoding مطابق با نمونه بالا استفاده کنیم.

نمایش قسمتی از متن و پاراگراف در MySQL


علاوه بر روش های بالا که صرفا متکی بر دستورات و توابع زبان برنامه نویسی PHP هستند، در سیستم مدیریت پایگاه داده MySQL و به هنگام اجرای پرس و جو (Query) نیز این امکان وجود دارد که بتوانیم نتایج را به تعداد حروف یا کلمات خاصی محدود کنیم، در ادامه با دو تابع SUBSTRING و SUBSTRING_INDEX آشنا خواهیم شد.

شمارش حروف با تابع SUBSTRING در MySQL


مانند آنچه در مورد برنامه نویسی کدهای PHP گفتیم در MySQL هم به دو روش شمارش حروف و شمارش کلمه می توانیم تعداد کاراکترها یا عبارات خروجی را به عدد خاصی محدود کنیم، برای شمارش حروف از تابع SUBSTRING به شکل نمونه زیر استفاده می کنیم:
mysqli_query($conn, "SELECT id, SUBSTRING(col_name, 1, 30) AS col_name FROM tbl_name ORDER BY id DESC LIMIT 1");
در مثال بالا با استفاده از تابع درونی SUBSTRING در MySQL از جدول فرضی tbl_name، ستون col_name کاراکترهای 1 تا 30 را انتخاب کرده ایم، البته این تابع نیز نسبت به حروف فارسی در مقایسه با حروف انگلیسی رفتاری متفاوت دارد و روشی که در ادامه خواهیم گفت برای زبان فارسی مناسبتر است.

شمارش کلمه با تابع SUBSTRING_INDEX در MySQL


در اغلب مواقع صرف شمارش حروف ایدآل نیست و معمولا کاراکترهای ناقص یا اضافه در خروجی خواهیم داشت، طراحان و برنامه نویسان وب عموما به دنبال راه حلی جهت شماره کلمه به کلمه هستند که برای این منظور در MySQL تابع SUBSTRING_INDEX به شکل نمونه زیر قابل استفاده است:
mysqli_query($conn, "SELECT id, SUBSTRING_INDEX(col_name, ' ', 30) AS col_name FROM tbl_name ORDER BY id DESC LIMIT 1");
در مثال بالا با استفاده از تابع درونی SUBSTRING_INDEX در MySQL از جدول فرضی tbl_name، ستون col_name تعداد 30 کلمه اول را انتخاب کرده ایم، خوشبختانه این روش با حروف فارسی سازگار است چون مبنای کار تابع بررسی فضای خالی (' ' در آرگیومنت دوم) بین کلمات است.
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP
ارسال ایمیل با PHP و کلاس PHPMailer
ارسال پارامتر به URL و دریافت مقادیر با PHP
آموزش ساخت نقشه XML سایت (Sitemap) با PHP و MySQL
نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
دیدگاه
more ۱۴۷ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
hossein
۱۸:۵۶ ۱۴۰۲/۰۷/۲۵
سلام وقت شما بخیر
کدی هست که بشود با کمک اون، به محض حذف محصول توسط فروشندگان (افزونه دکان)، تصاویر محصول نیز حذف شوند و نیازی به حذف تصاویر بعد از حذف محصول نباشد
ممنونم
با تابع unlink در PHP می توانید فایل مورد نظر را حذف کنید منتها کار با این تابع نیازمند تجربه قبلی و تعریف دقیق آدرس فایل است و در صورت اشتباه در تنظیم آدرس می تواند منجر به حذف ناخواسته دایرکتوری ها یا فایل های دیگر شود!
https://www.php.net/manual/en/function.unlink.php
همچنین با توجه به استفاده از افزونه خاص باید کدهای این افزونه در قسمتی که وظیفه حذف اطلاعات را دارد ویرایش شوند که فرآیندی زمانبر است و نیاز به دسترسی سرور و آشنایی با ساختار افزونه مورد نظر دارد.
hossein
۲۳:۱۲ ۱۴۰۲/۰۷/۱۴
سلام وقت شما بخیر
ممنون میشم اگه راهنماییم کنید میخوام کدی در اختیارم بزارید که بتونه برام سقف درصد مدیر را تعیین کنه توی افزونه (چند فروشندگی) دکان برای مثال: سهم مدیر سایت ۷ درصد میباشد تا حداکثر مبلغ ۳۵ هزار تومان، اگه محصولی مثلا قیمتش یک میلیون باشه دیگه درصد حساب نکنه همون مبلغ ثابت رو در نظر بگیره
کد مورد نظر شما نیازمند دسترسی به افزونه، آزمایش و خطا و سفارشی سازی اختصاصی آن می باشد که فرآیندی زمانبر است و متاسفانه در چارچوب خدمات ما قرار نمی گیرد.
سینا
۰۸:۲۶ ۱۴۰۲/۰۶/۲۵
با سلام و خسته نباشید
من برای ترجمه متن از گوگل ترانسلیت استفاده می کنم یه مشکلی که دارم اینکه وقتی متنی رو برام ترجمه می کنه کلمات و جملات داخل پرانتز و اصطلاحات رو ترجمه نمی کنه مثلا وقتی یه متن همه اش فارسی باشه ولی داخل پرانتزها اصطلاحی نوشته باشه که انگلیسی باشه اونو ترجمه نمی کنه! فقط تنهایی اون قسمتا رو باید ترجمه کنم می خوام کدی در اختیار داشته باشم که فارغ از اینکه متن انگلیسی باشه و یا هرچیزی همه رو به اون زبانی که میخوام ترجمه کنه
با تشکر
متاسفانه ما چنین کدی در اختیار نداریم و نوشتن آن هم فرآیندی زمانبر است و شامل خدمات سایت نمی شود، اما اگر کدی دارید که نیاز به راهنمایی و اصلاح دارد می توانیم در بخش هایی کمکتان کنیم.
امیرحسین
۱۶:۴۵ ۱۴۰۲/۰۴/۱۵
با تشکر از توضیحات مفیدی که دادید
استاد من می خوام از نوشته های یک متن که bold کرده ام بعنوان کلمات کلیدی استفاده کنم و می خوام این نوشته ها رو استخراج کنم
یعنی هرچقدر سرتیتر bold داشته باشم استخراج بشه و از اونا واسه تگ و برچسب استفاده کنم ممنون میشم به من کمک کنید. چون مجبورم همیشه تک تک کلماتی که bold کرده ام رو دستی وارد کنم.
با تشکر از لطف و محبت شما
برای پیدا کردن و استخراج محتوای داخل تگ های bold شده در PHP می توانیم یکی از روش های عبارات باقاعده در کنار تابع preg_match_all یا DOMDocument و تجزیه تگ متن را انتخاب کنیم، مثال:
<?php
$string = 'this is a test text for find <b>bold</b> titles in <b>PHP</b> programming...';
echo 'method 1:<br>';
preg_match_all('/<b>(.*?)<\/b>/si', $string, $matches);
//print_r($matches);
foreach($matches[1] as $key => $value) {
echo 'label: ' . $value . '<br>';
}
echo '--------------------------<br>';
echo 'method 2:<br>';
$dom = new DOMDocument;
@$dom->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));
$bolds = $dom->getElementsByTagName('b');
for($i = 0; $i < $bolds->length; $i++) {
$value = $bolds->item($i)->nodeValue;
echo 'label: ' . $value . '<br>';
}
?>
در این نمونه کدها فرض بر این است که از تگ های b در سورس متن استفاده شده، در صورتی که از تگ های strong یا موارد دیگر استفاده می کنید قاعدتا باید قسمت هایی از کدها را ویرایش کنید.
۰۰:۰۰ ۱۴۰۱/۰۸/۳۰
سلام من از نمونه کد
<?php
$content = file_get_contents('http:/example.com/');
$title = preg_match("/<!DOCTYPE html[^>]*>(.*?)<\\/body>/ims", $content, $match);
echo $match[1];
?>
برای نمایش قسمتی از سایت دیگه استفاده میکنم مشکلم اینه بعضی از سایت ها برداشت مطلب با این تابع رو بستن یعنی فکر میکنم دسترسی ربات ها رو بستن جایگزین این کد چه تابع یا نمونه کد هست؟
ممنون میشم راهنمایی کنید
با تشکر
اگر با تابع file_get_contents با مشکل مسدود شدن دسترسی مواجه می شوید می توانید روش تابع curl را با تنظیم اطلاعات واسط کاربری امتحان کنید، مثال:
<?php
$agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0';
$curl = curl_init('http://www.example.com/');
curl_setopt($curl, CURLOPT_USERAGENT, $agent);
$content = curl_exec($curl);
curl_close($curl);
$title = preg_match("/<!DOCTYPE html[^>]*>(.*?)<\\/body>/ims", $content, $match);
echo $match[1];
?>
البته این تابع تنظیمات دیگری هم دارد که در صورت نیاز می توانید در وب جستجو کنید.
نکته: محتوای برخی از سایت ها به صورت داینامیک ایجاد می شود به این صورت که وقتی صفحه سایت را در مرورگر بارگذاری می کنیم در مرحله بعد با اجرای دستورات جاوا اسکریپتی و ای جکس محتوای اصلی ایجاد می شود، در اینصورت استفاده از این روش ها کمکی به حل مشکل نمی کند و عملا روشی برای دریافت محتوای اینگونه سایت ها با کدنویسی وجود ندارد.
روناک قادری
۱۹:۰۲ ۱۴۰۱/۰۱/۱۱
با سلام
دست گلتون درد نکنه درست شد خدا خیرتون بده ببخشید این مدت خیلی مزاحمتون شدم ازتون خیلی چیزا یاد گرفتم انشاءالله به تموم آرزوهاتون برسید با تشکر فراوان این حالت پاسخ کپچا رو هم درست کردید الان دیدم خیلی عالی شده
بازم از لطف و محبتتون بسیار ممنون و سپاسگزارم
خواهش، خوشحالیم که مشکل رفع شد.
روناک قادری
۱۳:۳۰ ۱۴۰۱/۰۱/۱۱
با سلام
ببخشید یه سوال دیگه هم دارم البته بخدا شرمنده توی دیتابیس چطور می شه این اینترنتها رو عوض کرد؟ واسه همه چی بلدم فقط واسه اینهایی که خط به خط هستند نمی دونم مثلا اینطوری
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
اگه توی یه خط باشند مشکلی ندارم باهاشون ولی وقتی هر کدوم توی یه خط هستند نمی دونم چکارشون کنم مثلا می خوام همه اینها رو تبدیل به یکی کنم
update post set content = replace(content,"<br><br><br><br>","<br>");
واسه fie_get_contents هم بعضی وقتها برام پیش اومده که الگو رو باید اینطوری خطی وارد می کردم
که اونم بلد نبودم! الگوی خطی اونو چطوری وارد می کنند؟
مثلا اینطوری
<div class='main'>
<div class='menu'>
چطون اگه تنهایی وارد می کردم با تگ های دیگه هم مشترک بودن!
در دیتابیس اگر MySQL نسخه 8.0.12 به بعد باشد با تابع REGEXP_REPLACE در غیر اینصورت با تابع REPLACE می توانید کاراکتر خط شکن (Line Break) را به صورت نمونه زیر لحاظ کنید:
SELECT REPLACE((SELECT `col` FROM tbl WHERE `id` = 1), "<br>\r\n<br>\r\n<br>\r\n<br>", '<br>') 
در واقع در اغلب موارد rn نماد خط شکن است و گاهی صرفا n یا r خط جدید را ایجاد می کنند، برای نادیده گرفتن خط جدید در توابع PHP می توانید از نمونه کد زیر الگوبرداری کنید:
<?php
$str = "<div class='main'>
<div class='menu'>";
$pattern = '/<div class=\'([^\']+)\'>([\r\n]*)<div class=\'([^\']+)\'>/im';
$str = preg_replace($pattern, 'class for div 1: $1 , class for div 2: $3', $str);
echo $str;
?>
روناک قادری
۱۲:۴۷ ۱۴۰۱/۰۱/۱۱
با سلام و خسته نباشید
ببخشید باز مزاحمتون شدم شرمنده این الگو که بهم داده بودید خیلی خوبه فقط باز یه مشکلی داره!
<?php
$str = '<p>2-14-2 . مدل کارور و شی یر (1990) ..... 46 مدل کارور و شی یر</p>';
$pattern = '/(<p[^>]*>.*|<p[^>]*>.*\))([0-9\.\-](?=[^\)]*(?:[\(])))(.*<\/p>)/mui';
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$3', $str);
}
$pattern = '/(<p[^>]*>.*\).*)([0-9\.\-]+)(.*<\/p>)/mui';
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$3', $str);
}
اگه متن بصورت یه خرده تو در تو باشه و بعد p تگ span باشه هیچ بلایی سر متن نمیاره!
<p><span>1– 3 واسازی معرفت، هدف و کارکرد سیاست...................... 41</span></p>
اینطوری هیچ کاری به کارش نداره :-(
همان طور که قبلا گفتیم برای موارد اینچنین که الگوها می توانند متغیر باشند نوشتن یک دستور واحد به سختی امکانپذیر است، در هر صورت مطابق با آخرین الگوی ورودی می توانید از شیوه زیر استفاده کنید:
<?php
$str = '<p><span>1– 3 واسازی معرفت، هدف و کارکرد سیاست...................... 41</span></p>';
$pattern = '/(<p[^>]*>.*|<p[^>]*>.*\))([0-9\.\-\–]+(?=[^\)]*(?:[\(])))(.*<\/p>)/mui';
$str = str_replace('</p>', '(just_for_pattern_edhjkl)</p>', $str);
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$3', $str);
}
$pattern = '/(<p[^>]*>.*\).*)([0-9\.\-\–]+)(.*<\/p>)/mui';
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$3', $str);
}
$str = str_replace('(just_for_pattern_edhjkl)</p>', '</p>', $str);
echo $str;
?>
روناک قادری
۱۹:۳۳ ۱۴۰۱/۰۱/۰۹
از لطف و محبت شما بسیار ممنون و سپاسگزارم
خدا خیرتون بده خیلی عالی بود درست کار می کنه نه حواسم هست فقط واسه محتویات بعضی مطالب ازش استفاده می کنم اونم به این صورت که باید رمز تغییر رو وارد کنم بدون وارد کردن رمز چیزی عوض نمیشه وقتی رمز تغییر میزنم تݝییرات اعمال میشه اگه تغییرات اونی که میخواستم نبود باز یه رمز دیگه میزنم که تغییرات به حالت اصلی برمی گرده خیلی عالی بود اونی بود که من می خواستم
دست گلتون درد نکنه
ببخشید چرا من این دستور رو توی دیتابییس میزنم با اینکه از این کاراکتد خیلی موجوده ولی عمل نمی کنه؟
update post set content = replace(content,"&nbsp;","");
واسه ویرایش مطالب هم نوشتم که با ویرایش کردن این کاراکتر پاک بشه ولی واسه اونم کار نمی کنه قبلا پاک می کردـ
مثال:
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; دارد (به شیوه&nbsp;APA)</span></li>
توش پر از این کاراکتر هست ولی با زدن دستور عمل نمی کنه و میگه هیچ چیزی عوض نشد!
نمی دونم چرا
طبق تست ما کد مشکلی ندارد، ممکن است اطلاعات به شکلی که می بینید در دیتابیس ذخیره نشده باشند، به فرض کاراکتر & می تواند به معادل آن یعنی
&amp;
تبدیل شده باشد یا نسخه MySQL از تابع REPLACE به خوبی پشتیبانی نکند، همچنین شما باید قسمت WHERE را در پرس و جو در نظر بگیرید و جدول هم یک PRIMARY KEY یا UNIQUE Index داشته باشد.
https://dev.mysql.com/doc/refman/8.0/en/replace.html
روناک قادری
۰۱:۲۳ ۱۴۰۱/۰۱/۰۹
این دفعه درست شد
بخدا خیلی خجالت می کشم هی ازتون سوال می کنم آدم نباید کسی که بهش محبت و خوبی می کنه انقد اذیت کنه و مزاحمش بشه تورو خدا حلال کنید انشاءالله خدا هزاران برابر محبتهایی که به مردم می کنید هم در دنیا و هم در قبامت به خودتون و تموم عزیزانتون عنایت کنه اینو الان امتحان کردم خیلی خوب بود دست گلتون درد نکنه
فقط یه مشکل کوچیک می مونه اگه داخل متن اینطوری باشه
2-14-2.  مدل کارور و شی یر (1990)....46
داخل پرانتر عددها رو پاک می کنه و فقط پرانتزها می مونه واسه بقیه جاها خیلی عالی کار می کنه
الان تگ a رو دست نمی زنه و این خیلی خوبه انشاءالله منم دیگه مزاحتون نشم
دست گل پدر و مادرهای عزیزنتون رو می بوسم
خواهش، موردی ندارد، برای اینکه اعداد داخل پرانتر حذف نشوند از نمونه کد زیر استفاده کنید:
<?php
$str = '<p>2-14-2 . مدل کارور و شی یر (1990) ..... 46 مدل کارور و شی یر</p>';
$pattern = '/(<p[^>]*>.*|<p[^>]*>.*\))([0-9\.\-]+(?=[^\)]*(?:[\(])))(.*<\/p>)/mui';
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$3', $str);
}
$pattern = '/(<p[^>]*>.*\).*)([0-9\.\-]+)(.*<\/p>)/mui';
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$3', $str);
}
echo $str;
?>
لطفا دقت کنید این شیوه برای کارهای حساس خیلی توصیه نمی شود و با توجه به طیف وسیعی که ورودی ها ممکن است داشته باشند می تواند دچار خطا شود، حتما قبل از استفاده با حداکثر الگوهای مختلف تست کنید.
روناک قادری
۱۹:۵۰ ۱۴۰۱/۰۱/۰۸
با سلام و درود فراوان بر شما
از لطف و محبت شما بسیار ممنون و سپاسگزارم خیلی خوب بود فقط یه مشکلی داره من این پترن رو واسه تگ p فقط می خوام چون تگ <a> هم دارم که تگ آ نمی خوام شامل این خصوصیات بشه و این پترن فقط شامل حال اون باشه توی تگ a اگه عکسی چیزی باشه که عدد داشته باشه اونم پاک می کنه تگ های آ رو داخل تگ p قرار نمی دم که همه با هم یه خصوصیات رو به ارث نبرن یه چندتایی رو امتحان کردم هر چی داخل تگ a هم بود عوض کرد و عکس ها رو نشون نمیده
با تشکر فراوان
لطفا کد زیر را با حالت های مختلف تست کنید، طبق بررسی ما مشکلی نبود:
<?php
$str = '<p>2-3-6. ابعاد چهارگانه‌ی دسترسی به حوزه‌ی عمومی.. 50</p><a href="#">2-3-6</a>';
$pattern = '/(<p[^>]*>.*)[0-9\.\-]+(.*<\/p>)/mui';
while(preg_match($pattern, $str)){
$str = preg_replace($pattern, '$1$2', $str);
}
echo $str;
?>
روناک قادری
۰۴:۴۹ ۱۴۰۱/۰۱/۰۸
با سلام و خسته نباشید
ببخشید بازم یه سوال دارم البته به بزرگواری خودتون ببخشید من می خوام داخل تگ های p اعداد رو حذف کنم هرچی عدد و نقطه و خط تیره هست پاک بشه و فقط متن بمونه
مثلا:
<p>2-3-6. ابعاد چهارگانه‌ی دسترسی به حوزه‌ی عمومی.. 50</p>
می خوام اینطوری بشه
<p>ابعاد چهارگانه‌ی دسترسی به حوزه‌ی عمومی</p>
در انتها فقط متن ساده بمونه، پرانتز هم حذف نشه و اون بمونه مثلا اگه متن پرانتز داشت اونو حذف نکنه، کاراکترهای مجاز دو نقطه و کاراکتر ویرگول باشه و پرانتزها
: ، ()
خیلی از لطف و محبت شما ممنون و سپاسگزارم سوالها و بی اطلاعیهای منو به بزرگی خودتون ببخشید
با تشکر فراوان
مسئله ای نیست، برای حذف کاراکترهای دلخواه می توانید از تابع preg_match در PHP به شکل نمونه زیر استفاده کنید:
<?php
$str = '<p>2-3-6. ابعاد چهارگانه‌ی دسترسی به حوزه‌ی عمومی.. 50</p>';
$pattern = '/[0-9\.\-]+/i';
$replace = preg_replace($pattern, '', $str);
echo $replace;
?>
الگو صرفا مطابق با نمونه متن و خروجی مورد انتظار است.
روناک قادری
۰۱:۳۹ ۱۴۰۱/۰۱/۰۷
با سلام و تشکر فراوان از شما
بازم شرمنده بخدا عکس ها یا با <img> شروع میشن یا اینجوری
<img style="display: block; margin-left: auto; margin-right: auto;" title="برنامه حسابدار عکاسی و فیلمبرداری با اکسس" rel="nofollow" src="/images/products/8715/12.jpg" alt="برنامه حسابدار عکاسی و فیلمبرداری با اکسس" width="718" height="506"><br>
یا استایل دارن و یا ساده هستند و استایل ندارن از این دو حالت بیشتر نیستن و یا با
<figure class
و یا با
<figure>
تگ های p هم همین طور یا با
<p>
یا با
<p style
همین البته من با preg_repalce همیشه بقیه تگ ها رو به p تبدیل می کنم و یا استایلها رو باهاش حذف می کنم چون اونطوری که گفتید عکس ها با پاراگرفها شمارش نمیشن پس بهترین کار اینکه چهار حالت داشته باشیم که در این حالت div هم شاملش بشه! یعنی دقیقا و در نهایت این تگ ها
<p>
<div>
<img>
<figure>
و حالت باز اینا که شامل استایل میشن هر کدام از اینا یه پاراگراف حساب بشن البته یه چیزی یادم رفت که چون پرانتز رو باز گذاشتم و داخل پرانتر می تونه شامل هر نوع class و استایلی بشه!
انشاءالله هرچی از خدا میخواهید بهتون بده و فرشته ها و بقیه ملاک بهتون سجده کنن اینو از صمیم قلبم گفتم چون خیلی بامحبت و بزرگوار هستید خدا به خودتون و عزیزانتون سلامتی و خوشبختی بده
الهی آمین
یه پیشنهاد هم داشتم البته کادر جواب تست ربات بودن واسه ارسال کامنت رو telfield کنید چون جوابش جز عدد نیست و خیلی ها با گوشی میان و کامنت میدن اینطوری خیلی بهتر میشه
بازم شرمنده و با تشکر
خواهش، منظور این بود که اگر تگ ها (هر تگی) داخل تگ های p باشند مشکلی ایجاد نمی کنند، به فرض:
<p><img></p>
<p><div style="color:#ccc;"></p>
این حالت مشکلی ایجاد نمی کند، اما برای این حالت نیاز به نوشتن کد پیچیده و زمانبری است:
<p><img></p><br>
<p><div style="color:#ccc;"></p>text<br>
چون تگ های br اضافه و خارج از p یکپارچگی الگو را بهم می ریزد، به هر صورت هدف این بود که قبل از استفاده از کد به دقت حالت های مختلف را تست و بررسی کنید تا مشکل ناخواسته ای ایجاد نشود.
در مورد پیشنهاد اصلاح نوع فیلد ورود کد امنیتی ضمن تشکر فراوان از نکته سنجی حتما در اولین فرصت انجام می شود.
روناک قادری
۲۰:۴۵ ۱۴۰۱/۰۱/۰۶
با سلام و درود بر شما
بسیار از لطف و محبت شما ممنون و سپاسگزارم
بخدا منو خیلی شرمنده کردید نمی دونم چطوری ازتون تشکر کنم
خیلی بزرگوارید انشاءالله هرچیزی که توی دنیا و قیامت از خدا می خواهید بهتون بده هم به شما و هم به تموم عزیزانتون
الهی آمین
خیلی خوب بود به درستی کار می کنه فقط گفتید امکان داره تگ های دیگه ای هم وجود داشته باشند. من قبل از اینکه متن ها ذخیره بشه همه div ها رو تبدیل به p می کنم چون div ها اکثر اضافه هستند و شما لطف کردید یه بار تابع حذف تگ های اضافی رو برام فرستادید و اونم خیلی عالی عمل می کنه فقط یکی دو تا تگ می مونه تگ img و تگ figure که تعدادی از سایتها واسه قرار دادن تگ های img ازش استفاده می کنند اگه این دو تگ رو هم یک p یا همون پاراگراف حساب کنه و یا هر تگ غیر اینها رو هم p حساب کنه هیچی جا نمی مونه خیلی خوشحال شدم واسه همه پاراگراف ها به درستی کار می کنه و هیچ مشکلی نداره اگه img رو هم یک پاراگراف حساب کنه عالی میشه بقیه تگهای دیگه که مربوط به عکس هستند رو می شه قبل از ذخیره شدن به p و یا به img تبدیل کرد یه دنیا ازتون سپاسگزارم
یه همسایه ای دارم که هیچ وقت حتی یه چای هم بهم تعارف نکرده من اکثرا وقتی چیزی برای خودم درست می کردم براش می بردم چون می گفتم مثل من تنها و بی کسه البته همسایه که نه، صاحبخونه منه چند شب پیش ازش ناراحت شدم در حالیکه همیشه بهش کمک می کردم بعد گفتم دیگه کاری به کارش ندارم تا اینکه یاد کار شما افتادم شما نمی دونید کاربران کی هستند، چی هستند و از کجا هستند ولی بازم خالصانه و بدون هیچ چشم داشتی بهشون کمک می کنید وقتی یاد بزرگواری و کار شما افتادم با خودم گفتم اشکالی نداره اون همیشه ناراحتم می کنه و کاری واسه من انجام نمیده در حالیکه هیچ وقت چیزی ازش نخواستم من باز بهش کمک می کنم هر کاری از دستم بربیاد براش انجام میدم من کار خودم می کنم مثل شما که همیشه خوب هستید و به همه کمک می کنید
انشاءالله خدا بهتون سلامتی و خوشبختی بده
سپاس فراوان از محبت و دعای خیر شما متقابلا آرزوی سلامتی و دلخوشی داریم، در مورد تگ img و figure لطفا یک نمونه کد درج یا معرفی کنید تا دقیق تر بشود روی سورس ها اسکریپت را اصلاح کرد.
روناک قادری
۰۴:۲۷ ۱۴۰۱/۰۱/۰۶
ببخشید تورو خدا
برای این کد که لطف کردید برام نوشتیدـ
<?php
$html_str = '<p>پاراگراف اول</p><b>نمونه متن</b><p>پاراگراف دوم</p>';
$dom = new DOMDocument;
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $html_str);
$count_tag = $dom->getElementsByTagName('p')->length;
echo $count_tag;
?>
آیا راهی وجود داره که بشه متن رو باهاش تقسیم بندی کرد؟ چون ای برای شمارش پاراگراف هاست! و خیلی خوب تعداد پاراگراف هارو مشخص می کنه هرکاری کردم نتونستم مثلا یه متن ده پاراگرافی رو باهاش تقسیم کنم تقسیم به دو بخش که مثلا بهش اول ۵ تا پاراگراف رو در خودش ذخیره کنه و بخش دوم تعداد باقیمانده پاراگراف هارو با خودش ذخیره کنه من میخوام که متن به دو بخش تقسیم بشه اگه کمتر از پنج پاراگراف بود توی content ذخیره بشه
بقیه اش رو ذخیره کنم توی fullcontent چون متن زیاد باشه لود کردن صفحه اصلی سایت سنگین میشه به لطف و کمک شما خیلی چیزها ازتون یاد گرفتم و منو شرمنده خودتون کردید هدف از خلقت هر آدمی چیزیه که انسان از درکش عاجزه پیامبری فقط این نیست از طرف خدا به آدمی وحی بشه که برو فلانی رو راهنمایی کن کاری که شما می کنید کمتر از پیامبری نیست چون آدمهای زیادی مثل من ناآگاه ازتون خیلی چیزها یاد می گیرن دست پدر و مادر بزرگوارتون رو بخاطر کمکهایی که به مردم کردید و می کنید می بوسم انشاءالله در پناه خدا باشید اگه می بینید زود زود سوال می پرسم ببخشید احتمالا کامپیوترم بفروشم چون به پولش نیاز دارم و دیگه نمی تونم با گوشی درست و حسابی کار کنم شبها هم واسه این بیدارم مثل الان که ساعت نزدیک چهار و نیم صبحه چون کامپیوترم بفروشم انگیزه ای برام نمی مونه
خواهش می کنیم نظر لطف شما است، خوشحالیم اگر در این دنیای پر از سختی در حد توان کمکی کرده باشیم، در مورد سوالتان در صورتی که تگ های p به صورت متداول و پشت سر هم باشند می توانید برای تفکیک پاراگراف ها از نمونه کد زیر الگوبرداری کنید، در غیر اینصورت (یعنی اگر پاراگراف ها پشت سر هم و متوالی نباشند و بینشان تگ دیگری باشد کار پیچیده می شود و باید کد زمانبری نوشت):
<?php
$html_str = '<p>پاراگراف اول</p><p>پاراگراف دوم</p><p>پاراگراف سوم</p><p>پاراگراف چهارم</p><p>پاراگراف پنجم</p><p>پاراگراف ششم</p><p>پاراگراف هفتم</p>';
$pattern = "/(<p[^>]*>.*<\/p>)/isU";
preg_match_all($pattern, $html_str, $matches);
$start_content = null;
$end_content = null;
for($i = 0; $i < count($matches[0]); $i++) {
if($i < 5) {
$start_content .= $matches[0][$i];
} else {
$end_content .= $matches[0][$i];
}
}
echo $start_content;
echo '<hr>';
echo $end_content;
?>
در صورتی که از ثابت بودن فرمت سورس کد مورد نظر اطمینان ندارید کد بالا مناسب نیست و ممکن است برای کدهای مختلف خطا داشته باشد.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
8 × 4
20 × 20
=