gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:00:16 26 4
gpt4 key购买 nike

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。相反,在 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'));

关于php - 使用 PHP 从 html 标签中删除属性,同时保留特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29574097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com