我希望采用如下标记:
<span class="test">Some text that is <strong>bolded</strong> and contains a <a href="#">link</a>.</span>
并在 PHP 中找到剥离跨度的最佳方法,剩下的就是:
Some text that is <strong>bolded</strong> and contains a <a href="#">link</a>.
我已经阅读了许多有关使用 PHP DOM 而不是正则表达式解析 HTML 的其他问题,但一直无法找到一种方法来使用 PHP DOM 去除跨度,从而使 HTML 内容保持完整。最终目标是能够剥离文档中的所有跨度标签,保留其内容。这可以用 PHP DOM 来完成吗?有没有一种方法可以提供更好的性能并且不依赖字符串解析而不依赖DOM解析?
我已经使用正则表达式来执行此操作,到目前为止没有任何问题:
/<(\/)?(span)[^>]*>/i
但我的兴趣是成为一名更好的 PHP 程序员。由于正则表达式总是有可能因格式错误的标记而出错,因此我正在寻找更好的方法。我还考虑过使用 strip_tags() ,执行如下操作:
public function strip_tags( $content, $tags_to_strip = array() )
{
// All Valid XHTML tags
$valid_tags = array(
'a','abbr','acronym','address','area','b','base','bdo','big','blockquote','body','br','button','caption','cite',
'code','col','colgroup','dd','del','dfn','div','dl','DOCTYPE','dt','em','fieldset','form','h1','h2','h3','h4',
'h5','h6','head','html','hr','i','img','input','ins','kbd','label','legend','li','link','map','meta','noscript',
'object','ol','optgroup','option','p','param','pre','q','samp','script','select','small','span','strong','style',
'sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','ul','var'
);
// Remove each tag to strip from the valid_tags array
foreach ( $tags_to_strip as $tag ){
$ndx = array_search( $tag, $valid_tags );
if ( $ndx !== false ){
unset( $valid_tags[ $ndx ] );
}
}
// convert valid_tags array into param for strip_tags
$valid_tags = implode( '><', $valid_tags );
$valid_tags = "<$valid_tags>";
$content = strip_tags( $content, $valid_tags );
return $content;
}
但这仍然是解析字符串,而不是DOM解析。因此,如果文本格式错误,则可能会删除太多内容。许多人很快建议使用简单的 HTML DOM 解析器 http://simplehtmldom.sourceforge.net/,但是看源代码,似乎也是使用正则表达式来解析html。
这可以通过 PHP5 的 DOM 来完成吗?或者有没有更好的方法来剥离标签而保持其内容完整。使用 Tidy 或HTML 净化器 http://htmlpurifier.org/清理文本然后使用 regex / HTML 简单的 HTML DOM 解析器就可以了?
图书馆喜欢phpQuery http://code.google.com/p/phpquery/对于看似简单的任务来说,重量似乎太重了。