【问题标题】:Remove attributes from html tags using PHP while keeping specific attributes使用 PHP 从 html 标签中删除属性,同时保留特定属性
【发布时间】:2015-06-16 22:05:03
【问题描述】:

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

【问题讨论】:

  • 举个例子会更好。
  • 添加了示例。谢谢。
  • html 解析器有什么问题?为什么你更喜欢正则表达式?
  • 有太多的方法可以使 html 标记出错,从而导致 regex 出错
  • 这种方式更接近我所寻找的,但我肯定会接受更好的方式。

标签: php html regex


【解决方案1】:

您通常不应该使用正则表达式解析 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'));

【讨论】:

  • 您可以在 xpath 查询中进行检查,而不是在 if 语句中检查属性名称(您将节省大量迭代)。
  • 谢谢,效果很好。我只添加了一个字符集,因为结果有一些奇怪的字符格式: $dom->loadHTML('' . $f->description);
  • @CasimiretHippolyte 挑战,接受! Multitut,谢谢你,我会为未来的读者更新我的答案
  • 赞成,但是您的代码无法正常工作。请参阅this,并关注&lt;p&gt; 标签。它的位置并不像预期的那样。你能修复你的代码吗?
  • @stack。您有两个选择:将所有 HTML 包装在一个容器中(即有一个根节点),或者通过删除 LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD 作为选项允许 DOMDocument 为您执行此操作。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2010-10-20
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2014-09-27
相关资源
最近更新 更多