2016-01-26 6 views
2

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

Вот мой текущий код 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,…. Я хотел бы удалить пунктуацию после последнего слова, прежде чем положить многоточие.

Помощь?

+0

Попробуйте сопоставить конечную пунктуацию с ''/^ (. {1,300}) \ b \ p {P} */su'' и использовать только 'trim ($ match [1]). "& Hellip;"; '. –

+1

просто используйте wordwrap –

+0

@ WiktorStribiżew Не работает - [eval.in] (https://eval.in/508404) –

ответ

1

Вот ваше исправление ред подход:

$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

Это прекрасно, спасибо! –

1

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

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

\w перед тем \b гарантирует, что мы don'e добавить ellipsis после несловообразующим характера

+0

У меня были большие надежды, но это не сработало. [eval.in] (https://eval.in/508396) –

+0

Почему это дает мне 3 набора эллипсиса? Я хочу, чтобы это закончилось после 'pharetra ...'. Я не хочу, чтобы другие после него. –

+0

ok проверить обновленный ответ снова – anubhava