PDA

View Full Version : سوال: مشکل در استفاده از تابع substr در PHP برای کوتاه کردن متن



EmRa228
چهارشنبه 18 آذر 1388, 18:23 عصر
سلام، امیدوارم خوب باشید

وقتی از تابع substr درمورد نوشته های فارسی استفاده می کنم توی بعضی موارد این لوزی که توش علامت سئواله (�) به انتهای رشته اضافه میشه. چیکار کنم که این نیادش؟:متفکر:

http://www.filesara.com/files/gsfnajc7il1u1wbfeny.jpg


متن از دیتابیس خونده میشه. من فقط می خوام 55 کاراکترش رو به من نشون بده و بعدش "..." بذاره:



if (strlen($row['title']) > 55)
$title = substr ($row['title'], 0, 55)." ...";
else
$title = $row['title'];
ممنون

s_salavati2002
پنج شنبه 19 آذر 1388, 07:05 صبح
سلام، امیدوارم خوب باشید

وقتی از تابع substr درمورد نوشته های فارسی استفاده می کنم توی بعضی موارد این لوزی که توش علامت سئواله (�) به انتهای رشته اضافه میشه. چیکار کنم که این نیادش؟:متفکر:

http://www.filesara.com/files/gsfnajc7il1u1wbfeny.jpg


متن از دیتابیس خونده میشه. من فقط می خوام 55 کاراکترش رو به من نشون بده و بعدش "..." بذاره:



if (strlen($row['title']) > 55)
$title = substr ($row['title'], 0, 55)." ...";
else
$title = $row['title'];
ممنون



این بخاطر اینه که substr() تعداد کاراکتر های تک بایتی رو می گیره درواقع تو داری 55 بایتشو می گیره نه واقعا 55 کاراکتر
از تابع زیر استفاده کن


mb_substr()

EmRa228
جمعه 20 آذر 1388, 15:34 عصر
سلام، ممنون کاری رو که گفتی انجام دادم ولی هیچ فرقی نکرد.

if (strlen($row['title']) > 55)
$title = mb_substr ($row['title'], 0, 55)." ...";
else
$title = $row['title'];

s_salavati2002
جمعه 20 آذر 1388, 16:36 عصر
سلام، ممنون کاری رو که گفتی انجام دادم ولی هیچ فرقی نکرد.

if (strlen($row['title']) > 55)
$title = mb_substr ($row['title'], 0, 55)." ...";
else
$title = $row['title'];
خوب دوست عزیزم اینم می زدی دیگه


mb_internal_encoding("UTF-8");

angel_boy013
جمعه 20 آذر 1388, 17:40 عصر
برای utf-8 ازاین function استفاده کنی بهتر هست اما php 5 به بالا جواب میده



function utf8_safe_substr($string,$length,$start=0) {
//setting internal encoding to utf-8
iconv_set_encoding('internal_encoding', 'UTF-8');
$string=iconv_substr($string,$start,$length);
$string=iconv_substr($string,0,iconv_strrpos($stri ng,' ')+1);
return $string;
}
echo utf8_safe_substr('تست تست تست تست تست تست تست تست تستست تست .',15);

fumnimda
جمعه 20 آذر 1388, 18:14 عصر
توضیحی که دوستمون در بالا داد کاملا درست است. تابع substr تعداد کاراکترها رو در نظر می گیره و تو فارسی هم یک حرف فارسی چند کاراکتر تولید می کنه.
من خودم قبلا مشکل شما رو داشتم . اما با یک کلک حل شد. اونم اینکه به تعداد کاراکترهایی که می خوای با تابع substr بردار و بعد از آخر تا آخرین کاراکتر space رو حذف کن. یعنی آخرین کلمه که ممکن هست نصفه خورده باشه حذف می شه و دیگه از این کاراکترهای خرچنگ قورباغه نخواهی داشت.

مثال:



$hometext = substr($hometext,0,400);
$hometext = substr($hometext,0,strrpos($hometext,' ')).' ... ';

EmRa228
جمعه 20 آذر 1388, 20:35 عصر
خب اجازه بدید دونه دونه تست کرده و گزارش کنم:
- کد salavati2002


define ("LIMITTITL", "20");
mb_internal_encoding('UTF-8');
if (strlen($row['title']) > LIMITTITL)
$title = mb_substr ($row['title'], 0, LIMITTITL)." ...";
else
$title = $row['title'];
نتیجه: کار کرد ولی کلمه ها نصفه می شد!
مثل:

برنامه حضور مدیران گ ...

- کد angel_boy
این کد هم قاعدتا باید نتیجه بالا رو بده مگر اینکه بگند برای چی این کد بهتره؟

- کد fumnimda
به نظر من بهترین کد بود:


define ("LIMITTITL", "55");
mb_internal_encoding('UTF-8');
if (strlen($row['title']) > LIMITTITL){
$title = substr ($row['title'], 0, LIMITTITL);
$title = substr ($title, 0, strrpos($title," "))." ..."; }
else
$title = $row['title'];
چون کلمه ها دیگه توش نصفه نمی شه و نوشتنش راحت تره.

باتشکر از همه شما، امیدوارم این تاپیک مرجعی بشه واسه اونایی که مشکل علامت سئوال داخل لوزی رو پس از استفاده از تابع substr در آخر متن فارسیشون دارند.

یاعلی

angel_boy013
جمعه 20 آذر 1388, 22:08 عصر
- کد angel_boy
این کد هم قاعدتا باید نتیجه بالا رو بده مگر اینکه بگند برای چی این کد بهتره؟


شما تست کردین ؟ این فانکشن شر کلمه تموم میکنه نصفه نمیمونه کلمه

tony.montana
جمعه 05 خرداد 1391, 08:46 صبح
توضیحی که دوستمون در بالا داد کاملا درست است. تابع substr تعداد کاراکترها رو در نظر می گیره و تو فارسی هم یک حرف فارسی چند کاراکتر تولید می کنه.
من خودم قبلا مشکل شما رو داشتم . اما با یک کلک حل شد. اونم اینکه به تعداد کاراکترهایی که می خوای با تابع substr بردار و بعد از آخر تا آخرین کاراکتر space رو حذف کن. یعنی آخرین کلمه که ممکن هست نصفه خورده باشه حذف می شه و دیگه از این کاراکترهای خرچنگ قورباغه نخواهی داشت.

مثال:



$hometext = substr($hometext,0,400);
$hometext = substr($hometext,0,strrpos($hometext,' ')).' ... ';

اقا خدا عمرت بده این یک مورد مدت ها بود پدر من یکی در اورده بود
کدی که معرفی کردی کاملا جواب داد
ممنون

رضا قربانی
جمعه 05 خرداد 1391, 11:59 صبح
mb_internal_encoding('UTF-8'); echo mb_substr($minidesc,0,150);


یا اصلا می تونیم خلاصش کنیم : بچه ها چقدر بزرگش کردید :

echo mb_substr($minidesc,0,150,'UTF-8');

موفق باشید