سؤال

أحاول الحصول على هذه الطريقة في مرشح سلسلة يعمل:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top