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

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 مطالب بیشتر:
محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP
ساخت منوی هوشمند با PHP و CSS
ارسال ایمیل با PHP و کلاس PHPMailer
دیدگاه
more ۱۴۷ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
فرهادی
۰۸:۳۱ ۱۴۰۳/۰۱/۰۶
با تشکر از شما
یه سوال دیگه هم دارم توی تعدادی از سایتهای فروشگاهی صفحات سایت مپ به جای لینک صفحات حاوی لینکهایی هستند که پسوند gz دارند. مثل لینک زیر
حذف شد
اینها چی هستند و چطوری میشه لینکهای داخل اینارو استخراج کرد!
با تشکر
فرمت gz مخفف و به معنی GZip Compression یا فایل های فشرده است، برای استخراج اطلاعات این فایل ها در حالت تکی می توانید از یکی از روش های زیر استفاده کنید:
$xml_uncompressed = gzdecode(file_get_contents($url));

$xml_uncompressed = file_get_contents("compress.zlib://{$url}");

$xml_object = simplexml_load_file("compress.zlib://{$url}");
اما در حالت کلی و جایی که لینک ها در یک فایل XML قرار دارند این کدها باید با دستورات دیگری ترکیب شوند تا آدرس های URL داخل سایت مپ اصلی را مورد به مورد تجزیه کنند، به عبارتی نیاز به کدنویسی اختصاصی زمانبر است.
فرهادی
۱۸:۵۰ ۱۴۰۳/۰۱/۰۲
با سلام و درود
سال نو رو بهتون تبریک میگم یه سوال من میخوام لینکهای داخل صفحه sitemap.xml سایتها رو دربیارم کدش رو هم نوشتم الان واسه خیلی از سایتها کار می کنه و وقتی لینکها اونجا بصورت
<loc></loc>
هستن دیدید بعضی از سایتها صفحه سایت مپ اونا یه خرده استایل داره ولی وقتی میرم روی سورس اون صفحه اونجا هم لینکها داخل همین تگی هستن که نوشتم
این دو صفحه رو نگاه کنید:
حذف شد
اینجا صفحه بصورت xml است و لینکها داخل تگی که گفتم هستن پس واسه درآوردن لینکها مشکلی نیست حالا این صفحه و نگاه کنید
حذف شد
اینجا صفحه یه قالب داره ولی وقتی سورس صفحه رو نگاه می کنیم بصورت لینک اول هست کدهای من لینکهای لینک اول رو در میاره ولی واسه لینک دوم عکس العمل نداره می تونید راهنمایی کنید
با تشکر
<?php
$data = file_get_contents('sitemap.xml');
if( strpos($data, "sitemapindex") !== false) {
$s = preg_match('/<sitemapindex(.*?)<\\/sitemapindex>/ims', $data , $match);
} else {
$s = preg_match('/<urlset(.*?)<\\/urlset>/ims', $data , $match);
}

$match[1] =str_replace('sitemap','url',$match[1]);

$data = strip_tags($match[1],"<loc");
$d = preg_split("/<\/loc>
/",$match[1]);

foreach ( $d as $k=>$u ) {
if( strpos($u, "<loc") !== false) {
$u = preg_replace('/.*">/sm',"",$u);
$u = preg_replace("/<lastmod>(.*?)<\\/lastmod>/sm","",$u);
$u = preg_replace("/<changefreq>(.*?)<\\/changefreq>/sm","",$u);
$u = preg_replace("/<priority>(.*?)<\\/priority>/sm","",$u);
$u = preg_replace("/\".*/","",$u);
echo $u."<br>";}
}
?>
ضمن تبریک متقابل سال جدید، حالت دوم به صورت sitemapindex است که در الگوی شما تعریف نشده، کدهای بالا برای سازگاری با هر دو حالت ویرایش شدند.
فرهادی
۱۲:۵۸ ۱۴۰۲/۱۲/۲۱
ببخشید می تونید با سایت خودتون یه الگو رو چک کنید؟ با روش اول و دوم چک کنید وقتی الگو توی دیتابیس باشه مطلقا هیچی رو بر نمی گردونه! خروجی هم که از الگوی دیتابیس می گیرم هیچ مشکلی نداره و درسته
پیشنهاد می کنیم در یک دیتابیس و جدول فرضی اطلاعات را ذخیره و تست کنید، اگر مشکل پابرجا بود همان دیتابیس و جدول فرضی را در phpMyAdmin خروجی بگیرید و به آدرس ایمیل ما (موجود در بخش تماس) ارسال کنید تا دقیقا منطبق بر اطلاعاتی که شما با آن کار می کنید ما بتوانیم تست را انجام دهیم.
فرهادی
۱۱:۰۸ ۱۴۰۲/۱۲/۲۱
با تشکر از شما
جدول دیتابیس رو نگاه کردم و دقیقا به شیوه ای که نوشتن ذخیره شده و با htmlentities هم الگویی که من میخوام توی print_r نشون میده الگو هم وقتی بصورت بصورت عادی همین رو وارد می کنم فراخوانی رو انجام میده ولی وقتی از دیتابیس الگو رو میارم هیچی لود نمی کنه! از این الگو جاهای دیگه توی کدهای php استفاده کردم و مشکلی نداشته فقط وقتی از دیتابیس استفاده می کنم خروجی که از دیتابیس بهم میده نمی تونه الگو رو تشخیص بده و صفر رو بر می گردونه! در حالیکه وقتی جفت کدهای الگو رو وقتی پرینت می کنم یکی هستن دقیقا هیچی فرقی با هم ندارن فقط وقتی توی preg_match جا میدم اونی که توی دیتابیس هست کار نمی کنه! از دیشب درگیرش هستم و به نتیجه ای نرسیدم!
برای سایت شما هم همین کارو کردم جفت الگوها یکی پرینت میشن ولی اونی که توی دیتابیس هست هیچی رو بر نمی گردونه! من لازم دارم بدونه اینکه برم سراغ کدهای php الگوها رو از توی پنل مدیریت وارد دیتابیس کنم و هی لازم نباشه به کدهای php اضافه کنم
فرهادی
۰۸:۰۴ ۱۴۰۲/۱۲/۲۱
با سلام
من اومدم توی دیتابیس
$post
رو دقیقا به این صورت ذخیره کردم
/<div class=\"left\"[^>]*>(.*?)<\\/div>/ims;
بعد اومدم توی یه صفحه اینکارو کردم
$code = htmlentities("'".$post."'");
و
$page = file_get_contents('https://gama.ir/learnfiles/detail/65610');
و بعد
$s = preg_match($code, $page , $match);
echo $match[1];
هیچی رو نمیاره! هرکاری کردم هیچی اتفاقی نمی افته درحالیکه اینطوری کار می کنه
<?php
$page = Rh::file_get_contents('https://gama.ir/learnfiles/detail/65610');
$_code = '/<div class=\"left\"[^>]*>(.*?)<\\/div>/ims';
$s = preg_match($_code, $page , $match);
echo $match[1];
?>
من می خوام به شیوه اول کار کنه چون الگوها رو میخوام از توی پنل مدیریت توی دیتابیس ذخیره کنم و بعد فراخوانی هارو انجام بدم ولی واسه من کار نمی کنه!
ممنون میشم راهنمایی کنید
با تشکر
چند نکته در نمونه کدهای شما دیده می شود که احتمالا اشتباه است.
- تابع htmlentities کاراکترهای قابل اجرا و خاص HTML مانند <> را به معادل بی اثر آنها تبدیل می کند به فرض
<b>bold</b>
به حالت زیر تغییر می کند:
&lt;b&gt;bold&lt;/b&gt;
در صورتی که الگوی باقاعده شما مبتنی بر وجود این تگ ها است و اگر تبدیل شوند الگو تطابق نمی کند.
- نکته دیگر این است که ببینید در برنامه phpMyAdmin متن الگو دقیقا به چه شکلی در دیتابیس ذخیره شده است، اگر کاراکترهای <> به معادل آنها تبدیل شده باشند باید ابتدا از تابع html_entity_decode استفاده و آنها را به شکل اولیه برگردانید.
- ظاهرا الگو هم ایرادی دارد چون این قسمت
class=\"left\"[^>]*>
یعنی بعد از عبارت left کاراکتر " قرار بگیرد و بعد از این کاراکتر هر عبارت اختیاری غیر از < و در نهایت < باشد، در صورتی که بخش آخر اضافه به نظر می رسد و با عبارت " الگو بسته می شود، احتمالا الگو با توجه به محتوای هدف باید به یکی از حالت های زیر باشد:
'/<div class=\"left\">(.*?)<\\/div>/ims';

'/<div class=\"left[^>]*\">(.*?)<\\/div>/ims';
اطلاعات بیشتر در خصوص توابع تبدیل HTML:
https://www.php.net/manual/en/function.html-entity-decode.php

https://www.php.net/manual/en/function.htmlentities.php
بهاره هوشمندی
۰۳:۲۴ ۱۴۰۲/۱۰/۲۲
با سلام و خسته نباشید
واسه ترجمه از این تابع استفاده میکنم
<?php
class GoogleTranslate {
public static function translate($from, $target, $text): string {
$response = self::requestTranslation($from, $target, $text);
return self::getSentencesFromJSON($response);
}

protected static function requestTranslation($source, $target, $text): string {
$url = "https://translate.google.com/translate_a/single?client=at&dt=t&dt=ld&dt=qca&dt=rm&dt=bd&dj=1&hl=es-ES&ie=UTF-8&oe=UTF-8&inputm=2&otf=2&iid=1dd3b944-fa62-4b55-b330-74909a99969e";
$fields_string = http_build_query([
'sl' => $source,
'tl' => $target,
'q' => $text
]);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'AndroidTranslate/5.3.0.RC02.130475354-53000263 5.1 phone TRANSLATE_OPM5_TEST_1');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Length: ' . strlen($fields_string))
);

$result = curl_exec($ch);
curl_close($ch);

return $result;
}

protected static function getSentencesFromJSON($json): string {
$sentencesArray = json_decode($json, true);
$sentences = "";
foreach($sentencesArray["sentences"] as $s) {
if(!isset($s['trans']))
continue;
$sentences .= $s["trans"];
}
return $sentences;
}
}

$from = 'en';
$target = 'fa';
$text = 'this is <img src="http://example.com/this/is/a/test/image.png" alt="something"> a test text!';
$call = new GoogleTranslate();
echo $call::translate($from, $target, $text);
?>
کد بالا با افزودن چند خط پایانی تست شد، خروجی به صورت زیر بود و مشکلی نداشت:
این <img src="http://example.com/this/is/a/test/image.png" alt="something"> یک متن آزمایشی است!
بهاره هوشمندی
۱۶:۲۶ ۱۴۰۲/۱۰/۲۱
با سلام و خسته نباشید
وقتی میخوام با گوگل ترانسلیت متنی رو با php ترجمه کنم عکس ها رو خراب می کنه چون توی عکس ها هم متن انگلیسی هست و اونا رو هم قاتی می کنه چیکار کنم وقتی با استفاده از اسکریپت یه متنی رو ترجمه می کنه به لینک عکسها و یا لینک های داخل href کاری نداشته باشه؟ لینک عکسها و لینک ها رو نمی خوام کاری بهشون داشته باشه چون خراب میشن
با تشکر
تا آنجایی که اطلاع داریم ترجمه گوگل پارامتری تحت عنوان format دارد که می توانید به صورت plain-text یا در حالت مد نظر شما html آن را تنظیم کنید، البته راهنمای روشنی برای نحوه استفاده از این تنظیمات در سایت توسعه دهنده گان گوگل وجود ندارد اما احتمالا در تابع curl یا در آدرس URL می توانید به صورت پارامتر متد GET آن را تنظیم کنید، در صورت نیاز به راهنمایی بیشتر لطفا کد قابل تست را به آدرس ایمیل ما (موجود در بخش تماس) ارسال و نتیجه را از همان طریق پیگیری کنید.
بهاره هوشمندی
۱۹:۲۶ ۱۴۰۲/۱۰/۱۸
با سلام
لینک رو نگاه کردم خوب بود ولی من میخوام برای کاربر بنویسم که تا ۱۰ ثانیه صبر کنه که کاربر صفحه رو لود نکنه چون سفید می بینه!
این فقط یه دایره چرخ میزنه و میره
آموزش این روش در سایت به روز شد، می توانید با درج عبارت "نمایش پیام در حال بارگذاری با جاوا اسکریپت" در قسمت جستجو به این مطلب دسترسی پیدا کنید.
بهاره هوشمندی
۲۰:۲۶ ۱۴۰۲/۱۰/۱۷
با سلام و خسته نباشید استاد
لود کردن کوئری های سایت من واسه یه صفحه زیاده و ۱۰ تا ۱۵ ثانیه طول میکشه که همه کوئری ها لود بشه بعد کاربران فکر میکنن سایت خراب شده ولی بعد لود کردن همه چی بارگزاری میشه سیستم من yii است میخوام توی کنترلر یه کدی بذارم یا راه حلی داشته باشه که وقتی کاربر صفحه رو سفید می بینه پیام لطفا منتظر بمانید رو ببینه و منتظر باشه یا مثل سایت شما وقتی سایت لود میشه درصد لود شدن رو به کاربر نشون بره که فکر نکنه سایت خرابه
با تشکر
برای نمایش پیام صفحه در حال بارگذاری لطفا آموزش این سایت را بررسی کنید:
https://www.geeksforgeeks.org/how-to-show-page-loading-div-until-the-page-has-finished-loading/ 
سجاد مهدوی
۰۲:۱۳ ۱۴۰۲/۱۰/۱۰
با سلام
ببخشید می تونید توی سایت نوبیتکس ثبت نام کنید و با api هایی که دادن یه کد بنویسید که اعلام موجودی رو بهمون بده؟ خیلی بهش نیاز دارم ممنون میشم اینکارو واسم انجام بدید
با تشکر
متاسفانه انجام سفارش برنامه نویسی در حال حاضر پذیرفته نمی شود.
بهاره هوشمندی
۰۹:۳۸ ۱۴۰۲/۰۹/۱۰
سلام استاد
خسته نباشید
ببخشید باز مزاحم شدم اگه من بخوام از تگ strip_tags استفاده کنم و استثنا قائل بشم استایل های اون تگ هارو هم می گیره من میخوام اون استثناها باشه ولی استایل هارو نگیره و متن خروجی ساده باشه
strip_tags($contant,'<h1><h2><b><br><p>');
الان اینارو استثنا کردم ولی متن اصلی واسه این تگ ها هر استایلی داشته باشه برای این کد هم لحاظ می شه! من میخوام خروجی همه ی اینا بدون استایل باشه
با تشکر فراوان
لطفا یک نمونه سورس متن و آخرین تغییراتی که اعمال کرده اید را به صورت پیوست به آدرس ایمیل ما ارسال کنید تا بررسی و نتیجه را خدمتتان اعلام کنیم.
بهاره هوشمندی
۰۷:۰۷ ۱۴۰۲/۰۹/۰۲
استاد ببخشید
وقتی یه متن طولانی رو باهاش چک می کنم اگه تگ span و b داشته باشه چون تگ رو نمی بنده تا آخر اون متن رو تغییر میده، یعنی bold و یا استایل span رو می گیره. مثلا یه جایی رو من bold کردم توی متن ویرایش شده بعد واسه مقایسه اونجا رو نشون میده که b بهش اضافه شده و bold شده ولی خب از اونجا تا آخر متن چون تگ <b> براش باز شده همه رو با فونت bold نشون میده، و اگه span هم داشته باشه همین طوره یعنی استایل ها رو به خودش می گیره چون تگ باز میشه و بسته نمی شه تا آخر متن من می خوام فقط علایم نگارشی و ویرایشی رو ببینم مثلا یه جایی یه ویرگول و یا خط فاصله و یا نقطه و یا... اضافه شده باشه ببینم و اگه کلمه ای حذف و اضافه شده باشه اونم ببینم اگه جایی رنگی شده فقط رنگش رو ببینم که تغییر داده شده این کد واسه متن ساده که این چیزهایی که گفتم رو نداشته باشه خیلی عالی کار می کنه ولی واسه این تگ هایی که گفتم استایل اون تگ هارو به خود می گیره
با تشکر بسیار فراوان و شرمنده :(
همان طور که گفتیم این الگوریتم به صورت آماده در وب در دسترس است و در شرایط متفاوت و برای حالت های کاربردی تست نشده، اما طبق بررسی ما و تغییراتی که اعمال کردیم در تگ های تست شده مشکلی نداشته هرچند با متن های طولانی فرآیند اجرای کدها زمانبر می شود، در هر صورت برای بررسی بیشتر لطفا یک یا چند نمونه سورس HTML به همراه خروجی مورد انتظار را به آدرس ایمیل سایت (موجود در بخش تماس) ارسال و نتیجه را از طریق ایمیل پیگیر باشید، فرآیند بررسی و رفع ایرادات یا نوشتن الگوریتم جدید می تواند بین چند روز تا هفته زمانبر باشد.
بهاره هوشمندی
۱۲:۳۹ ۱۴۰۲/۰۹/۰۱
با سلام استاد بزرگوار
از لطف و محبت شما بسیار ممنون و سپاسگزارم خیلی عالی بود
اینطوری خیلی خوب شد دستتون درد نکنه ان شاءالله همواره تنتون سالم باشه و دلتون خوش خیلی کارم رو راه میندازه
یه دنیا ازتون ممنونم
خواهش، نظر لطف شما است، خوشحالیم اگر کمکی کرده باشیم.
بهاره هوشمندی
۰۱:۲۴ ۱۴۰۲/۰۹/۰۱
با سلام و از شما
من این کد رو امتحان کردم واسه متن عادی خوبه و جواب میده ولی واسه متن طولانی که رنگ متن عوض شده باشه توی خروجی هم همه استایلی که بهش دادیم رو یک دست می کنه اگه جایی متن رو bold کرده باشیم بازم تا آخر اون متن خروجی رو bold می کنه می خوام خروجی که میده بصورت decode باشه و مشخص بشه کجا تغییر صورت گرفته و اینکه اگه خروجی هم به این شکل نبود فقط توی خروجی تغییرات نگارشی و ویرایشی رو نشون بده که بفهمم چی به چی شده من می خوام بدونم یک متن از اول که چی بوده با ویرایش کجاهاش تغییر کرده بصورت نوشتاری ببینم تغییرات به چه شکلی لحاظ شده الان هر استایلی که متن به خودش گرفته باشه توی خروجی همه رو تا پاراگراف آخر نشون میده و مشخص نمیشه چه اتفاقی افتاده!
با تشکر از شما
تابع پاسخ قبل را مطابق با توضیحات شما ویرایش کردیم، در این تابع تگ های اختصاصی به صورت [-tag_name-] استفاده شده که نباید از قبل در سورس های شما موجود باشد.
بهاره هوشمندی
۰۲:۳۷ ۱۴۰۲/۰۸/۳۰
با سلام و خسته نباشید استاد بزرگوار
آیا راهی وجود داره تفاوت دو تا متن رو با php پیدا کرد؟
مثلا
text = "این یک متن تکست هست";
text = "این، یک متن تکست هست";
با تشکر
دقیقا مشخص نکرده اید خروجی مد نظرتان باید به چه شکلی باشد اما توابع آماده ای برای نمایش تفاوت های دو متن در وب وجود دارد، نمونه کد:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<style>
.deleted {
color: #E4041A;
animation: deleted-blink 1s infinite;
}
@keyframes deleted-blink {
0% {color: #E4041A;}
75% {color: transparent;}
100% {color: #E4041A;}
}
.inserted {
color: #447F1C;
animation: inserted-blink 1s infinite;
}
@keyframes inserted-blink {
0% {color: #447F1C;}
75% {color: transparent;}
100% {color: #447F1C;}
}
</style>
</head>
<?php
function computeDiff($from, $to) {
$diffValues = array();
$diffMask = array();

$dm = array();
$n1 = count($from);
$n2 = count($to);

for($j = -1; $j < $n2; $j++) $dm[-1][$j] = 0;
for($i = -1; $i < $n1; $i++) $dm[$i][-1] = 0;
for($i = 0; $i < $n1; $i++) {
for($j = 0; $j < $n2; $j++) {
if($from[$i] == $to[$j]) {
$ad = $dm[$i - 1][$j - 1];
$dm[$i][$j] = $ad + 1;
} else {
$a1 = $dm[$i - 1][$j];
$a2 = $dm[$i][$j - 1];
$dm[$i][$j] = max($a1, $a2);
}
}
}

$i = $n1 - 1;
$j = $n2 - 1;
while(($i > -1) || ($j > -1)) {
if($j > -1) {
if($dm[$i][$j - 1] == $dm[$i][$j]) {
$diffValues[] = $to[$j];
$diffMask[] = 1;
$j--;
continue;
}
}
if($i > -1) {
if($dm[$i - 1][$j] == $dm[$i][$j]) {
$diffValues[] = $from[$i];
$diffMask[] = -1;
$i--;
continue;
}
}
{
$diffValues[] = $from[$i];
$diffMask[] = 0;
$i--;
$j--;
}
}

$diffValues = array_reverse($diffValues);
$diffMask = array_reverse($diffMask);

return array('values' => $diffValues, 'mask' => $diffMask);
}

function diffline($line1, $line2) {
$diff = computeDiff(str_split($line1), str_split($line2));
$diffval = $diff['values'];
$diffmask = $diff['mask'];

$n = count($diffval);
$pmc = 0;
$result = '';
for($i = 0; $i < $n; $i++) {
$mc = $diffmask[$i];
if($mc != $pmc) {
switch($pmc) {
case -1:
$result .= '[-end_del-]';
break;
case 1:
$result .= '[-end_ins-]';
break;
}
switch($mc) {
case -1:
$result .= '[-start_del-]';
break;
case 1:
$result .= '[-start_ins-]';
break;
}
}
$result .= $diffval[$i];

$pmc = $mc;
}
switch($pmc) {
case -1:
$result .= '[-end_del-]';
break;
case 1:
$result .= '[-end_ins-]';
break;
}

$result = htmlentities($result);
$result = str_replace('[-start_del-]', '<span class="deleted">', $result);
$result = str_replace('[-end_del-]', '</span>', $result);
$result = str_replace('[-start_ins-]', '<span class="inserted">', $result);
$result = str_replace('[-end_ins-]', '</span>', $result);

return $result;
}

$text_1 = 'این یک <b>متن</b> تکست هست';
$text_2 = 'این، یک متن تکست هست';
echo diffline($text_1, $text_2);
?>
</html>
در این نمونه کد زیر کاراکترهای متفاوت خط کشیده می شود.
به روزرسانی: امکان فرمت تگ های HTML و نمایش موارد تغییر کرده به صورت انیمیشن به کد اضافه شد.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
4 × 6
20 × 20
=