Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何匹配不在<;a>;和它的href,使用JavaScript?_Javascript_Html_Regex - Fatal编程技术网

如何匹配不在<;a>;和它的href,使用JavaScript?

如何匹配不在<;a>;和它的href,使用JavaScript?,javascript,html,regex,Javascript,Html,Regex,我正在搜索页面以查找特定的关键字。这本身就很容易。更复杂的是,如果这个关键字是标记的一部分,我就不想匹配它 例如 上面的问题是,如果它是href的一部分,它仍然与关键字匹配 有什么想法吗? 谢谢使用JavaScript正则表达式无法可靠地做到这一点。使用.NET正则表达式引擎是为数不多的支持无限长lookback断言的引擎之一,但JavaScript根本不知道lookback断言,因此您无法回过头来查看要匹配的文本之前的内容 因此,您应该要么使用DOM解析器(我相信精通JavaScript的人可

我正在搜索页面以查找特定的关键字。这本身就很容易。更复杂的是,如果这个关键字是
标记的一部分,我就不想匹配它

例如

上面的问题是,如果它是
href
的一部分,它仍然与关键字匹配

有什么想法吗?
谢谢

使用JavaScript正则表达式无法可靠地做到这一点。使用.NET正则表达式引擎是为数不多的支持无限长lookback断言的引擎之一,但JavaScript根本不知道lookback断言,因此您无法回过头来查看要匹配的文本之前的内容

因此,您应该要么使用DOM解析器(我相信精通JavaScript的人可以在这里提出一种实用的方法),要么阅读文本,删除所有的
标记(如果您是勇敢的类型,您可以使用正则表达式来做这件事),然后在文本的其余部分搜索关键字

编辑:

嗯,有一个肮脏的黑客,你可以使用。这并不漂亮,如果你看Alan Moore对你的问题的评论,你可以想象这个正则表达式会以多种方式失败,但它确实适用于你的例子:

/keyword(?!(?:(?!<a).)*</a)/

/keyword(?)(?:(?)与他的示例代码类似。如果它位于不同标记的属性中,例如
?或者位于注释、CDATA节或处理指令中,该怎么办?如果它是脚本或样式表的一部分,该怎么办?这样疯狂就存在了。。。
var tester = new RegExp("((?!<a.*?>)("+keyword+")(?!</a>))", 'ig');
/keyword(?!(?:(?!<a).)*</a)/
keyword    # Match "keyword"
(?!        # but only if it is not possible to match the following regex in the text ahead:
 (?:       # - Match...
  (?!<a)   # -- unless it's the start of an <a> tag...
  .        # -- any character
 )*        # - any number of times
 </a>      # then match a closing <a> tag. 
)          # End of lookahead assertion.