【问题标题】:regular expression to match specific text not linked正则表达式匹配未链接的特定文本
【发布时间】:2010-02-10 00:54:18
【问题描述】:

我想在 javascript 中编写一个正则表达式来匹配特定文本,只有当它不是 html 链接的一部分时,即

match <a href="/link/page1">match text</a>

不会匹配,但是

match text

<p>match text</p>

会匹配。

(每次运行搜索时,“匹配文本”都会改变 - 我将使用类似的东西

var tmpStr = new RegExp("\bmatch text\b","g");

“匹配文本”的值是从数据库中读取的。)

到目前为止,我在正则表达式方面的最大努力是

\bmatch text\b(?!</a>)

这涉及关闭,但不是初始。这对于我的目的可能会很好,但它似乎并不理想。对于改进正则表达式的任何帮助,我将不胜感激。

【问题讨论】:

  • 看到这个previous SO question
  • 对不起,威尔,比你快 11 秒。 :)
  • 感谢您的快速回复。我不认为它是一回事 - 我只想匹配标签内的文本 - 但如果标签存在(即匹配文本,但不匹配 text) - 但我猜你的信息是不是要用正则表达式来解析html?
  • 基本上,这取决于您的情况有多具体。例如,您是否也想避免匹配&lt;a href="..."&gt;test match text foo&lt;/a&gt;?如果是这样,那么使用正则表达式解决问题会比您始终知道您不想匹配的内容永远不会与链接中的其他文本一起出现要困难得多。

标签: javascript html regex


【解决方案1】:

你可以使用否定的look-behind来获取开头&lt;a href=...

var tmpStr = new RegExp('(?<!<a.*?>)match text(?!</a>)');

希望对你有用。

【讨论】:

  • 您的意思是 "(?!)match text(?!)" 吗? - 这正是我想要的,非常感谢您
  • 请注意,这不会避免匹配match text 内部的&lt;a href="..."&gt;test match text foo&lt;/a&gt;
  • @Dav:是的,抱歉,没走那么远。虽然听起来很难/不可能处理每一个案例;)
  • @Tomba,我相信(?&lt;!&lt;a.*?&gt;) Eric 打算写的。你在使用消极的后视,不是吗,埃里克?麻烦的是,JavaScript 不支持lookbehinds。但即使它确实如此,正则表达式对于这项任务也毫无用处,除非你能以某种方式简化问题,正如 Dav 上面建议的那样。
【解决方案2】:

感谢您提供非常快速和有用的答案。澄清一下,我最终使用的正则表达式是

(?!<a.*?>)\bmatch text\b(?!</a>)

【讨论】:

  • 你知道上面的表达式会匹配&lt;a href="test.html"&gt;match text &lt;/a&gt;,对吗?事实上,它会匹配在&lt;/a&gt; 之前有空格或其他文本的任何内容,因为(?!&lt;a.*?&gt;) 实际上什么都不做 - 您在上面发布的正则表达式在功能上完全相同您的 OP 中发布的“尽力而为”:\bmatch text\b(?!&lt;/a&gt;) - 为什么?因为(?!&lt;a.*?&gt;)\b\b 相同 - 对不是单词边框的内容进行前瞻,后跟要求单词边框,只会匹配单词边框。
  • 基本上,这里有两种情况:要么你需要在任何地方匹配match text,除非它是链接内的唯一的东西(即&lt;a href="..."&gt;match text&lt;/a&gt;,没有空格,没有其他标签,什么都没有)-在这种情况下,您在 OP 中的正则表达式已经可以正常工作而无需修改;或者您需要匹配文本,但前提是它不在链接内,即使包裹在其他文本中(即&lt;a href="..."&gt;&lt;strong&gt;match text&lt;/strong&gt;&lt;/a&gt; 不应该匹配),在这种情况下,上面的正则表达式不会工作。无论哪种方式,在前面添加(?!&lt;a.*?&gt; 并没有真正获得任何好处。
  • @Dav - 感谢您的解释。尽管从问题中看并不明显,但理想情况下,我希望匹配包含在 标记中的“匹配文本”,无论是否有空格(基本上我想要做的是找到一个某个字符串,然后将其转换为链接,除非它已经是链接)。但是,我可以 99% 确定匹配将是链接中唯一的内容,因此原始 (OP) 正则表达式在实践中可能会正常工作。
  • 感谢 Dav 和其他人指出我的回答没有意义!由于下面有价值的cmets,我没有删除答案。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多