使用PHP从html标记中删除属性,同时保留特定属性

时间:2015-04-11 04:23:25

标签: php html regex

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,清理它,并在相应的表格上更新它。

1 个答案:

答案 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中的所有标记,并删除不是srchref的属性。

$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'));
相关问题