Я пытаюсь придумать следующую функцию, которая обрежет строку целых слов (если это возможно, в противном случае он должен усечь до символов):Объединение два регулярных выражений для усечения слов в строках
function Text_Truncate($string, $limit, $more = '...')
{
$string = trim(html_entity_decode($string, ENT_QUOTES, 'UTF-8'));
if (strlen(utf8_decode($string)) > $limit)
{
$string = preg_replace('~^(.{1,' . intval($limit) . '})(?:\s.*|$)~su', '$1', $string);
if (strlen(utf8_decode($string)) > $limit)
{
$string = preg_replace('~^(.{' . intval($limit) . '}).*~su', '$1', $string);
}
$string .= $more;
}
return trim(htmlentities($string, ENT_QUOTES, 'UTF-8', true));
}
Здесь некоторые тесты:
// Iñtërnâtiônàlizætiøn and then the quick brown fox... (49 + 3 chars)
echo dyd_Text_Truncate('Iñtërnâtiônàlizætiøn and then the quick brown fox jumped overly the lazy dog and one day the lazy dog humped the poor fox down until she died.', 50, '...');
// Iñtërnâtiônàlizætiøn_and_then_the_quick_brown_fox_... (50 + 3 chars)
echo dyd_Text_Truncate('Iñtërnâtiônàlizætiøn_and_then_the_quick_brown_fox_jumped_overly_the_lazy_dog and one day the lazy dog humped the poor fox down until she died.', 50, '...');
Они оба работают, как это, однако, если я бросаю второй preg_replace()
я получаю следующее:
Iñtërnâtiônàlizætiøn_and_then_the_quick_brown_fox_jumped_overly_the_lazy_dog и один день лентяй горбатые в бедную лису вниз, пока она не умерла ....
Я не могу использовать substr()
потому что он работает только на уровне байтов и не имеют доступа к mb_substr()
ATM, я сделал несколько попыток присоединиться к второму регулярному выражению с первым, но безуспешно.
Пожалуйста, помогите S.M.S., я боролся с этим почти час.
EDIT: Я сожалею, я не спал в течение 40 часов, и я бессовестно пропустил это:
$string = preg_replace('~^(.{1,' . intval($limit) . '})(?:\s.*|$)?~su', '$1', $string);
Тем не менее, если кто-то имеет более оптимизированный регулярное выражение (или тот, который игнорирует тянущаяся пространство), пожалуйста, поделитесь:
"Iñtërnâtiônàlizætiøn and then "
"Iñtërnâtiônàlizætiøn_and_then_"
EDIT 2: Я до сих пор не могу избавиться от задних пробелов, может кто-нибудь помочь мне?
РЕДАКТИРОВАТЬ 3: Хорошо, ни одно из моих исправлений действительно не работает, меня обманывает RegexBuddy - я должен, вероятно, оставить это на другой день и немного поспать. На сегодня.
Бедные лисы. _____ – kennytm
Почему вы не используете 'trim', чтобы избавиться от конечного пробела? – Jens
Пробудитесь в течение 40 часов и занимайтесь регулярным выражением. +1 жалость. –