اقتطاع سلسلة متعددة إلى N chars
سؤال
أحاول الحصول على هذه الطريقة في مرشح سلسلة يعمل:
public function truncate($string, $chars = 50, $terminator = ' …');
كنت أتوقع هذا
$in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890";
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …";
وكذلك هذا
$in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ";
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …";
إنه $chars
ناقص chars من $terminator
سلسلة.
بالإضافة إلى ذلك ، من المفترض أن يقطع المرشح عند حدود الكلمة الأولى أدناه $chars
الحد ، على سبيل المثال
$in = "Answer to the Ultimate Question of Life, the Universe, and Everything.";
$out = "Answer to the Ultimate Question of Life, the …";
أنا متأكد من أن هذا يجب أن يعمل مع هذه الخطوات
- مبلغ العقد الفرعي من chars في المنهي من الحد الأقصى chars
- التحقق من صحة هذه السلسلة أطول من الحد المحسوب أو إرجاعها دون تغيير
- ابحث عن حرف الفضاء الأخير في السلسلة أدناه المحسوبة للحصول على حدود الكلمات
- قطع السلسلة في الفضاء الأخير أو الحد المحسوب إذا لم يتم العثور على مساحة أخيرة
- قم بإلحاق Terminator إلى String
- سلسلة العودة
ومع ذلك ، فقد جربت مجموعات مختلفة من str*
و mb_*
وظائف الآن ، ولكن جميعها أسفرت عن نتائج خاطئة. لا يمكن أن يكون هذا صعبًا للغاية ، لذلك من الواضح أنني أفتقد شيئًا. هل يشارك شخص ما تنفيذ عمل لهذا أو أشرني إلى مورد حيث يمكنني أخيرًا فهم كيفية القيام بذلك.
شكرًا
ملاحظة نعم ، لقد راجعت https://stackoverflow.com/search؟q=truncate+String+Php قبل :)
المحلول
جرب هذا:
function truncate($string, $chars = 50, $terminator = ' …') {
$cutPos = $chars - mb_strlen($terminator);
$boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
}
ولكن عليك أن تتأكد من ضبط الترميز الداخلي الخاص بك بشكل صحيح.
نصائح أخرى
اكتشفت للتو أن PHP لديه بالفعل مقطوعة متعددة
mb_strimwidth
- احصل على سلسلة مقطوعة بعرض محدد
لا يطيع حدود الكلمات رغم ذلك. ولكن في متناول يدي!
لا أحب عادةً مجرد ترميز إجابة كاملة على سؤال مثل هذا. لكنني أيضًا استيقظت للتو ، واعتقدت أن سؤالك ربما سيجعلني في مزاج جيد للذهاب للذهاب لبقية اليوم.
لم أحاول تشغيل هذا ، لكن يجب أن يعمل أو على الأقل يجعلك 90 ٪ من الطريق إلى هناك.
function truncate( $string, $chars = 50, $terminate = ' ...' )
{
$chars -= mb_strlen($terminate);
if ( $chars <= 0 )
return $terminate;
$string = mb_substr($string, 0, $chars);
$space = mb_strrpos($string, ' ');
if ($space < mb_strlen($string) / 2)
return $string . $terminate;
else
return mb_substr($string, 0, $space) . $terminate;
}