使用PHP从DOM HTML中删除所有链接

3

有一个字符串$processhtml包含一些HTML代码。我想使用PHP从HTML中删除所有链接标签及其内容。

举个例子:

"This is some text with <a href="#">link</a>"

必须成为:

"This is some text with"

我需要在DOMDocument的帮助下对HTML进行其他解析,因此尝试查找与DOM相关的解决方案。

我已经尝试过:

           $dom = new DOMDocument();
           @$dom->loadHtml($processhtml);
            foreach ($dom->getElementsByTagName('*') as $element) {
                if ($element->nodeName == 'a') {
                    $element->parentNode->removeChild($element);
                }
            }
            echo $dom->saveHTML();

结果如下:
  1. 一些链接完全被移除了(不错)

  2. 一些链接被替换成“问号”字符(奇怪)

  3. 一些链接没有改变(不好)

enter image description here

所以我的问题是:

1)是什么导致了我使用的代码不一致?如何解决?

2)有没有更好的方法来实现所需的功能?(正则表达式不行:P)

提前谢谢!


嗨,问号来自编码问题,请确保声明正确的编码。 如果您想要100%的效率,我宁愿使用preg_replace()匹配所有以“{{link1:”开头的元素,并将它们替换为空字符串。然后进行另一个替换,如下所示:str_replace('}}','',$my_string); - Vincent Teyssier
@VincentTeyssier,那么<a ...></a>之间的内容呢?它也必须被删除。 - Acidon
请确保保留HTML的字符集。例如,如果输入的HTML是UTF8,并且您脚本的输出环境是ISO8859,则会出现损坏的字符。此外,请比较输入HTML和输出HTML。DOM对其输入非常挑剔,即使是最简单的HTML格式错误也可能导致DOM出错。 - Marc B
@VincentTeyssier 我之前尝试过那种方法,但是存在一些不一致性,并且我担心一些错误的HTML格式可能会导致混乱。通过使用DOM,我希望能找到最可靠的方法来完成它。 - Acidon
你可能不喜欢它,但 HTML 是文本,而正则表达式就是为此而生的。正则表达式不会错过任何一个块,因此它是100%有效的。但我愿意听取任何意见,以证明它不能捕获100%所需的正则表达式。 - Vincent Teyssier
显示剩余6条评论
1个回答

2
$pattern = '/<a .*?<\/a>';
preg_replace($pattern, "", $processhtml);

已在 https://regex101.com/ 上进行测试并运作良好。


1
我有一本《精通正则表达式第三版》在书架上积了灰,也许是时候开始研究这本超过500页的怪兽了 :) 非常感谢! - Acidon
正则表达式是噩梦,但它们工作得非常好... regex101.com 很详细地介绍了你可以在 SO 上找到的正则表达式,因此你可以在不需要广泛知识的情况下进行调整... 享受吧 :) - Vincent Teyssier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接