2 に答える
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 のデモを見る
コメントで指摘したように、句読点を (オプションで で) 一致させることができますが、それが後続の単語境界と先頭の単語境界の両方に一致すること\p{P}*
を忘れていました。を否定先読み( など) で制限することにより、末尾の単語境界のみに一致します。\b
\b
(?!\w)
(?!\w)\b
さらに、キャプチャ グループ ( (...)
) がパターンに追加され、末尾の句読点が削除された文字列のみがグループ 1 にキャプチャ$match[1]
され、値に でアクセスできるようになります。
于 2016-01-26T21:34:24.060 に答える