Многоточие после определенного числа или символов с границами слова

Я пытаюсь поставить многоточие (…), чтобы сократить длинные описания и хочу иметь границы слов.

Вот мой текущий код eval.in:

# Assume $body is a long text.
$line = $body;
if(strlen($body) > 300 && preg_match('/^.{1,300}\b/su', $body, $match)) {
$line = trim($match[0]) . "…";
}
echo $line;

Это на самом деле работает довольно хорошо, и мне это нравится, за исключением того, что в некоторых случаях после границы слова ставится пунктуация.

Если я использую код выше, я получаю результаты, подобные следующим:

This is a long description… или же I have punctuations,…, Я хотел бы убрать пунктуацию после последнего слова перед тем, как поставить многоточие.

Помогите?

2

Решение

Вот ваш фиксированный подход:

$body = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu congue ex. Nunc sem arcu, fermentum vel feugiat quis, consequat nec enim. Quisque et pulvinar velit, et laoreet justo. Integer quis sapien ac turpis mattis lobortis at at metus. Vestibulum euismod turpis odio, id luctus quam pharetra, at, et. Sed finibus, nunc at ultricies posuere, dui mauris aliquet quam, eget aliquet ligula libero a turpis. Pellentesque eu diam sodales, sollicitudin leo et, sagittis magna. Donec feugiat, velit quis condimentum porttitor, enim sapien varius elit, sit amet pretium risus turpis vitae massa. Sed ac ligula sit amet lorem scelerisque tristique a id ex. Nullam maximus tincidunt magna, vel molestie lectus tempus non. Sed euismod placerat ultricies. Morbi dapibus augue ut odio faucibus, vel maximus nisl pharetra. Aliquam hendrerit dolor in ipsum pharetra, eget tincidunt lacus ultrices.";

$line = $body;
if(strlen($body) > 300 && preg_match('/^(.{1,300})(?!\w)\b\p{P}*/su', $body, $match)) {
$line = trim($match[1]) . "…";
}
echo $line;

Увидеть eval.in demo

Как я отметил в комментариях, вы можете сопоставить знаки препинания (опционально, с \p{P}*), но я забыл, что \b может соответствовать как трейлинг а также ведущая граница слова. Ограничивая \b с негативным взглядом (?!\w) (лайк (?!\w)\b) мы соответствуем только задний граница слова.

Кроме того, группа захвата ((...)) добавляется в шаблон так, чтобы мы только захватить в группу 1 обрезается строка с конечной пунктуацией, и значение можно получить с помощью $match[1],

1

Другие решения

Ты можешь использовать:

$body = preg_replace('/^(.{0,299}\w)\b.*/su', '$1…', $body);

\w до \b гарантирует, что мы не добавим ellipsis после неслова

1

По вопросам рекламы [email protected]