نشان دادن قسمت محدودی از اول رشته

Salman_MP

Member
سلام
اینو نوشتم چون لازمش داشتم. بعد یادم اومد که چند بار اینجا یه چیزایی خونده بودم که دوستان با نوشتنش مشکل داشتن. مثلاْ چون کاراکترهای یونیکد دوبایتی هستن اگر از وسط قطعشون کنیم یه چیزای الکی نشون میده که کاراکترهای نمایشی نیستن !؟
حالا اینو ببینین و اگر ایرادی هم داشت بگین .
یه ایرادی که داره اینه که طول رشته های یونیکد رو نصفه حساب میکنه یعنی اگر بگی به طول ۲۰ و تلورانس ۴ به طول 10 و تلورانس 2 حساب میکنه ...
PHP:
function cut_str($str, $length, $tolerance)
{
	$length --;
	$len = strlen($str);
	if ($length > $len)
		return $str;
	else
	{
		$i = $length - $tolerance;
		if($i < 0) $i = 0;
		while($i <= ($length + $tolerance))
		{
			if(ctype_space($str[$i]))
				return substr($str, 0, $i)." ...";
			else
				$i++;
		}

		if(ctype_alnum($str[$i]))
			return substr($str, 0, $i)." ...";
		else
			return substr($str, 0, $i-1)." ...";
	} 
}
 
آخرین ویرایش:
فکر کنم فضای خالی وسط رشته هست منهم به این مشکل خورده بودم قبل از اینکه با تابع substr کار کنی فضای خالی حذف کن و تست کن
 

NabiKAZ

Well-Known Member
درست همين موضوع رو قبلا اينجا ديده بودم که يه کسي يه سورس گذاشته بود براي رفع اين مشکل ...
اما مدتي بعد که بهش نياز پيدا کردم هر چي گشتم چيزي پيدا نکردم !
يه تاپيک هم زدم که کسي اين تاپيک رو نديده ؟! که تاپيک خودم قفل شد !
حالا خوشحالم که مجدد اين بحث پيش اومد ، کسي نميدونه اون تاپيک کجاست ؟!
 

Salman_MP

Member
هادی ابراهیمی گفت:
فکر کنم فضای خالی وسط رشته هست منهم به این مشکل خورده بودم قبل از اینکه با تابع substr کار کنی فضای خالی حذف کن و تست کن

ممنون ولی منظورت اینه که نباید فضای خالی رو جزو رشته به حساب بیارم ؟ (خوب این مشکلی نیست)
اگر کسی در مورد اون مشکلی که خودم گفتم نظری داره بگه که درستش کنم.
 

Salman_MP

Member
هادی ابراهیمی گفت:
حتماً میدونی که چیجوری حذف کنی :wink:
اوه ... حالا فهمیدم منظورت چیه ؟
یعنی میگی اول فضاهای خالی رو پاک کنم بعدش ...... ok. اگه منظورت white space ه که نه یه همچین چیزی نیست. این مشکل برای اینه که کاراکترای یونیکد دو بایتی هستن .
در ضمن اینجوری فضای خالی رو پاک می کنم :
PHP:
function full_trim($str)
{
	$var = preg_split("/\s+/", $str);
	for($i=0; !empty($var[$i]); $i++)
		$res .= $var[$i];
	return $res;
}
خوبه ؟
البته اینو همین جا نوشتم و کد قابل اعتمادی نیست. ولی اگه درست کار کنه هر چی white space هست میریزه دووور
D:
 
آخرین ویرایش:
من با دستور full_trim آشنایی ندارم ولی میدونم trim فقط کارکتر خالی ابتدا وانتها رشته را حذف میکنه برای حذف مابین کلمات دستوری دیگری هست یادم نیست ولی برات پیدا میکنم

حلا نمیتونی برای نشوندن قسمتی از رشته، کارکتر خاصی مثل * یا - بهش اضافه کنی تو در موقع نمایش با دستور substr فقط تا اون کارکتر نمایش بدی تا اینکه بیای طول رشته حساب کنی و بعد بقیه ....
 
من با دستور full_trim آشنایی ندارم ولی میدونم trim فقط کارکتر خالی ابتدا وانتها رشته را حذف میکنه برای حذف مابین کلمات دستوری دیگری هست یادم نیست ولی برات پیدا میکنم

حلا نمیتونی برای نشوندن قسمتی از رشته، کارکتر خاصی مثل * یا - بهش اضافه کنی تو در موقع نمایش با دستور substr فقط تا اون کارکتر نمایش بدی تا اینکه بیای طول رشته حساب کنی و بعد بقیه ....
 

Salman_MP

Member
1- اون تابع full_trim رو خودم نوشتم و یه تابع کتابخونه ای (!) نیست.
2- در مورد پیشنهادت باید بگم که راه خوبی نیست چون دو راه ممکنه که پیشنهاد بشه :
اولی اینکه از هر فیلد متنی که میخام یه قسمتیش رونوشون بدم دو تا نگه دارم . یکی با * و یکی دیگه بدون *
دومی اینکه یکی نگه دارم و هر موقع میخام نشون بدم اون کاراکتر کدایی(*) رو پاک کنم (در این حالت باید مطمئن باشم که جای دیگه ای این کاراکتر ظاهر نشده)

بعدشم اگه یه وقت تصمیم گرفتم به جای 10 حرف مثلاً 15 حرف نشون بدم باید برم تمام رشته ها رو به روز کنم و لی در این حالت هیچکدوم از مشکلای فوق الذکر وجود نداره.
 
ولی substr کارکتر بعد از * ذخیره میکنه در ضمن بدون * همچنین میتونی توی یک آرایه ذخیره کنی که دسترسی و سرچ توشراحت باشه
به حر حال این یک نظر
 

koobagher

New Member
من هم اين مشكل را دارم
چگونه مي توانم رشته هاي فارسي را در PHP با استفاده از توابع لازم جدا يا كوتاه كنم. با توجه به اينكه مي خواهم رشته هاي فارسي را كه در فورمها submit مي شوند در بانكهاي MySQL
ذخيره كنم و نياز داشتم طول رشته هاي فارسي را براي فيلد مربوطه كوتاه كنم ولي متوجه شدم اين رشته ها دو بايتي بوده و به علاوه تابع substr هم در مورد آنها درست كار نمي كند. خواستم از تابع mb_substr استفاده كنم ولي web server اين توابع را ساپورت نمي كند و لازم است ابتدا ماژول مربوطه در سرور توسط ميزبان نصب شود. لطفا بگوييد چگونه كاري كنم كه رشته هاي فارسي در فورمها يك بايتي شوند و دوم اينكه چگونه رشته هاي فارسي دو بايتي را پردازش كنم
 

جدیدترین ارسال ها

بالا