我有以下功能:
function truncate($string, $limit, $break=".", $pad="...") {
if(strlen($string) <= $limit) return $string;
if(false !== ($breakpoint = strpos($string, $break, $limit))) {
if($breakpoint < strlen($string) - 1) {
$string = substr($string, 0, $breakpoint) . $pad;
}
}
return $string;
}
Run Code Online (Sandbox Code Playgroud)
如果我有以下代码:
$html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>';
print truncate($html, 30);
Run Code Online (Sandbox Code Playgroud)
它将切断某些.....换句话说,我们以:
<div style="bla: bla;">somet
Run Code Online (Sandbox Code Playgroud)
即一个未公开的div标签.我该如何解决这个问题?
更新:
我不想在我到达时才截断.我想要一些可以自动添加div的东西.在这种情况下,输出应为:
<div style="bla: bla;">somet</div>
Run Code Online (Sandbox Code Playgroud)
即它实际上添加了因为它知道它是未封闭的?我是否正确假设我必须使用像html净化器这样的东西?
不要截断它,$html而是截断它适当的真实文本.要掌握文本,可以使用php的xml函数(DOM,SimpleXml)或正则表达式.虽然我先建议.
使用Dom的示例:
$html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>';
$dom = new DomDocument;
$dom->loadHtml($html);
$xpath = new DomXpath($dom);
// example of getting a div with id=bla
$bla = $xpath->query('//div[@id="bla"]')->item(0);
if ($bla instanceof DomNode) {
// truncate here
if (strlen($bla->nodeValue) > 10) {
$bla->nodeValue = substr($bla->nodeValue, 0, 10) . '...';
}
}
// collect result, this is needed due to dom->loadhtml wrapping the loaded string
// with html/body if not present
$result = '';
foreach ($xpath->query('//body/*') as $childNode) {
$result .= $dom->saveHtml($childNode);
}
echo $result;
Run Code Online (Sandbox Code Playgroud)