使用regex排除以片段URL开头的锚标记



我们使用的WordPress插件之一是依靠regex来检测HTML中的锚标记。代码如下:

$regexp = "<as[^>]*href=("??)([^" >]*?)\1[^>]*>(.*)</a>";
preg_match_all("/$regexp/siU", $string, $matchArray);

这导致$matchArray填充有所有锚标签,包括在href属性中仅具有片段URL的锚标签(例如:href="#this-is-an-id"href="#"不应匹配(。

我们正在尝试更新regex,以忽略带有片段URL的锚点标记。我尝试了以下正则表达式,但它似乎有效。Regex不是我的强项,我希望在正确的方向上寻求任何有用的指导。

$regexp = "<as[^>]*href=("[^#.*]??)([^" >]*?)\1[^>]*>(.*)</a>";

附言:我们的目标是解决这个问题,并向原始插件作者提交一份PR,这样它就会得到纠正。

如果你只是想忽略以#开头的URL,你可以使用这个:

$regexp = "<as[^>]*href=("??)([^#"][^" >]*?)\1[^>]*>(.*)</a>"

演示

最新更新