PHP正则表达式替换HREF属性

3

如何使用php的preg_replace正则表达式来删除所有包含<a href="#的超链接。这是我写的代码,但它不起作用。

$newlink = preg_replace('/^<a href="#(.*)" (?:.*?)>(.*)<\/a>/is', '', $link);

我希望您可以替换这些链接,它们作为一个 锚标记
<a href="#part1">go to part1</a>
<a href="#part2">go to part2</a>
<a href="#part3">go to part3</a>

清空数值。


它们不匹配,因为它们在第二个引号 " 后没有像你的正则表达式所要求的那样留有空格。但是如果你使用正则表达式处理 HTML,请非常小心。几乎在任何情况下,这都不是你想要做的,而应该使用适当的解析器。 - Howard
你从哪里获取输入?我认为使用HTML解析和XPath会更容易。 - Felix Kling
5个回答

3

首先,使用正则表达式来解析/修改HTML文档可能是错误的方法。如果您需要进行其他修改,请参阅DOM Document

话虽如此,使您的表达式非贪婪(.*?)可能会起作用。

$newlink = preg_replace('/^<a href="#(.*?)"[^>]+>(.*?)<\/a>/', '', $link);

注意:这也假设你所有的锚点标签中href属性是第一个属性,这可能是个不太准确的假设。


1
它只是从HTML中删除href属性。
echo preg_replace('/(<[^>]+) href=".*?"/i', '$1', $content);

0
如果您只想替换href的值,您需要使用断言来匹配它而不匹配其他任何内容。这个正则表达式只会匹配URL:
/(?<=<a href=")#.*?(?=")/

0

首先感谢你们两位的回答,但是你们的答案对我来说仍然不起作用。

我不擅长使用正则表达式,我阅读了很多文档并进行了修改。也许这看起来很丑陋,但它确实有效 :)

$newlink = preg_replace('/(<a href=")#.*?(<\/a>)/is', '', $link);

1
不需要捕获组。正则表达式可以简化为:'/<a href="#.*?<\/a>/is' - ridgerunner

0

使用/(<a.*?href=([\'"]))(.*?)(\2.*?>)/i正则表达式

<?php 
     $oldLink = '<a href="http://test.com">click this link</a>';
     $res = "http://stackoverflow.com";
     echo $newLink = preg_replace('/(<a.*?href=([\'"]))(.*?)(\2.*?>)/i', '$1'.$res.'$2', $oldLink);    
?>

如果你想测试这个正则表达式,那么你可以在这里 链接 https://regex101.com/r/mT1sVK/1 进行测试。

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