我有这个示例代码:
<?php
$string='Left text from tag <div title="hello world" class="CSS">What is <b>going on</b> here?<br> Calm up <em>right now</em>.</div> Right text. Possible another <div title="" class="DD">tag..</div> but not always.';
echo strip_tags($string);
?>
此代码的结果是:
Left text from tag What is going on here? Calm up right now. Right text. Possible another tag.. but not always.
但是,我的目标是删除此strip_tags函数删除的标记之间的所有文本(包括标记)。 IE浏览器。结果应该是:
Left text from tag Right text. Possible another but not always.
我知道可以使用preg_replace来完成它,但它太慢了,所以可能有更快的解决方案..(不一定与strip_tags函数有关)。
答案 0 :(得分:1)
在我看来,使用REGEX是最好和最紧凑的解决方案。试试这个:
echo preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $string);
如果您不想使用preg_replace,请使用手册中提到的自定义功能strip_tags_content()。
function strip_tags_content($text, $tags = '', $invert = FALSE) {
preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags);
$tags = array_unique($tags[1]);
if(is_array($tags) AND count($tags) > 0) {
if($invert == FALSE) {
return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
} else {
return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
}
} elseif($invert == FALSE) {
return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
}
return $text;
}
echo strip_tags_content($string);
注意:我不认为只能使用PHP函数实现所需的输出。您需要以某种方式使用REGEX。
答案 1 :(得分:1)
DOMDocument方法怎么样?
<?php
$string='Left text from tag <div title="hello world" class="CSS">What is <b>going on</b> here?<br> Calm up <em>right now</em>.</div> Right text. Possible another <div title="" class="DD">tag..</div> but not always.';
$dom = new DomDocument();
$dom->loadHTML('<body>' . $string . '</body>');
$stripped = '';
$els = $dom->getElementsByTagName('body')->item(0)->childNodes;
$len = count($els) - 1;
foreach($els as $index => $child) {
if (is_null($child->tagName))
$stripped .= ' ' . trim($child->nodeValue);
}
$stripped = substr($stripped, 1);
echo $stripped;
Left text from tag Right text. Possible another but not always.