我正在使用Wordpress,正在输出帖子的the_content
(使用HTML格式)。我正在使用substr
将其修剪为500个字符。
我想确保内容没有被中间词切断,所以我已经调整它以使用strpos
查找单词的结尾,这是本节的代码可以正常工作。
$post_content = get_the_content_with_formatting();
$post_trimmed = substr($post_content, 0, strpos($post_content, ' ', 500));
print $post_trimmed . '...';
问题在于,strpos
有时会在一个单词之后切割,并且会破坏HTML。例如,这里有一些我得到的HTML:
<p>
Marketing Assistant<br>
Marketing Executive<br>
<br... <="" p=""></br...></p>
我正在尝试破译正在发生的事情,但我认为我基本上需要在一个单词的结尾处进行 strpos
修剪,而且还要在HTML标记的末尾进行修饰例如&gt;和&lt; 以确保它不会破坏HTML。
你会怎么做?
答案 0 :(得分:0)
这并不像你想象的那样直截了当。话虽如此,已经讨论过,并在另一个StackOverflow post中概述了解决方案。
这里是他们使用的功能,仅供参考:
function printTruncated($maxLength, $html, $isUtf8=true)
{
$printedLength = 0;
$position = 0;
$tags = array();
// For UTF-8, we need to count multibyte sequences as one character.
$re = $isUtf8
? '{</?([a-z]+)[^>]*>|&#?[a-zA-Z0-9]+;|[\x80-\xFF][\x80-\xBF]*}'
: '{</?([a-z]+)[^>]*>|&#?[a-zA-Z0-9]+;}';
while ($printedLength < $maxLength && preg_match($re, $html, $match, PREG_OFFSET_CAPTURE, $position))
{
list($tag, $tagPosition) = $match[0];
// Print text leading up to the tag.
$str = substr($html, $position, $tagPosition - $position);
if ($printedLength + strlen($str) > $maxLength)
{
print(substr($str, 0, $maxLength - $printedLength));
$printedLength = $maxLength;
break;
}
print($str);
$printedLength += strlen($str);
if ($printedLength >= $maxLength) break;
if ($tag[0] == '&' || ord($tag) >= 0x80)
{
// Pass the entity or UTF-8 multibyte sequence through unchanged.
print($tag);
$printedLength++;
}
else
{
// Handle the tag.
$tagName = $match[1][0];
if ($tag[1] == '/')
{
// This is a closing tag.
$openingTag = array_pop($tags);
assert($openingTag == $tagName); // check that tags are properly nested.
print($tag);
}
else if ($tag[strlen($tag) - 2] == '/')
{
// Self-closing tag.
print($tag);
}
else
{
// Opening tag.
print($tag);
$tags[] = $tagName;
}
}
// Continue after the tag.
$position = $tagPosition + strlen($tag);
}
// Print any remaining text.
if ($printedLength < $maxLength && $position < strlen($html))
print(substr($html, $position, $maxLength - $printedLength));
// Close any open tags.
while (!empty($tags))
printf('</%s>', array_pop($tags));
}
printTruncated(10, '<b><Hello></b> <img src="world.png" alt="" /> world!'); print("\n");
printTruncated(10, '<table><tr><td>Heck, </td><td>throw</td></tr><tr><td>in a</td><td>table</td></tr></table>'); print("\n");
printTruncated(10, "<em><b>Hello</b>w\xC3\xB8rld!</em>"); print("\n");