代码之家  ›  专栏  ›  技术社区  ›  Raju Mandapati

使用正则表达式排除以片段URL开头的锚定标记

  •  0
  • Raju Mandapati  · 技术社区  · 4 年前

    我们正在使用的WordPress插件之一是依靠正则表达式来检测HTML中的锚标记。代码如下:

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

    这导致 $matchArray 填充了所有锚定标记,包括在 href 属性(例如: href="#this-is-an-id" href="#" 不应该匹配)。

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

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

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

    0 回复  |  直到 4 年前
        1
  •  1
  •   jdaz    4 年前

    如果你只是想忽略以 # ,您可以使用:

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

    Demo