我found a way使用php删除html字符串中的所有标记属性:
$html_string = "<div class='myClass'><b>This</b> is an <span style='margin:20px'>example</span><img src='ima.jpg' /></div>";
$output = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $html_string);
echo $output;
//<div><b>This</b> is an <span>example</span><img/></div>
但我想保留某些标签,例如src和href。我几乎没有定期表达的经验,所以任何帮助都会非常感激。
[可能]相关更新:这是“清洁”过程的一部分。数据库上的帖子。我正在遍历所有帖子,获取html,清理它,并在相应的表格上更新它。
答案 0 :(得分:3)
您通常不应使用正则表达式解析HTML。相反,在PHP中,您应该调用DOMDocument::loadHTML
。然后,您可以通过文档中的元素进行递归并调用removeAttribute
。众所周知,HTML标签的正则表达式非常棘手。
参考:http://php.net/manual/en/domdocument.loadhtml.php
示例:http://coursesweb.net/php-mysql/html-attributes-php
这是适合您的解决方案。它将迭代DOM中的所有标记,并删除不是src
或href
的属性。
$html_string = "<div class=\"myClass\"><b>This</b> is an <span style=\"margin:20px\">example</span><img src=\"ima.jpg\" /></div>";
$dom = new DOMDocument; // init new DOMDocument
$dom->loadHTML($html_string); // load the HTML
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//@*');
foreach ($nodes as $node) {
if($node->nodeName != "src" && $node->nodeName != "href") {
$node->parentNode->removeAttribute($node->nodeName);
}
}
echo $dom->saveHTML(); // output cleaned HTML
以下是使用xPath过滤属性名称的另一种解决方案:
$dom = new DOMDocument; // init new DOMDocument
$dom->loadHTML($html_string); // load the HTML
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//@*[local-name() != 'src' and local-name() != 'href']");
foreach ($nodes as $node) {
$node->parentNode->removeAttribute($node->nodeName);
}
echo $dom->saveHTML(); // output cleaned HTML
提示:如果您使用扩展字符,请将DOM解析器设置为UTF-8:
$dom->loadHTML(mb_convert_encoding($html_string, 'HTML-ENTITIES', 'UTF-8'));