具有多个负面条件的正则表达式预测

时间:2013-09-16 22:03:44

标签: regex regex-lookarounds

我正在对HTML字符串执行正则表达式以获取URL。我想获取所有不是javascript的href和src。从另一个SO帖子我有以下模式:

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)*"/

其中的结果如下:

src="http://www.mydomain.com/path/to/resource/image.gif" alt="" border="0"

这很好,因为它缺少.js结果。这很糟糕,因为它在元素中获取了额外的标签。我尝试了以下修正案,以便在第一个"停止:

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)[^"]*"/

它的工作原理是它返回href =“$ url”,但它返回以.js结尾的结果。有没有办法结合一个负面的前瞻说:

  • 匹配字符串,直到遇到另一个" - 即[^"]*;
  • 如果字符串以.js"
  • 结尾,则不匹配

提前感谢任何帮助/提示/指示。

4 个答案:

答案 0 :(得分:2)

添加“?”在最后一个引用之前的“*”。这将使“*”非贪婪,即:它将在第一个引号停止匹配,而不是最后一个

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)*?"/

答案 1 :(得分:1)

如果您只想拒绝字符串末尾的.js,则可以在字符串匹配的最后部分使用以下内容:

"(?![^"]*\.js").*?"

按此Rubular

答案 2 :(得分:1)

这里有点不同。我在Debuggex中使用了这个表达式:

(?:src|href)=(?&.quotStr)(?<!\.js")

将它编译成这个:

$regex = '/(?:src|href)=(?:"((?:\\\\.|[^"\\\\]){0,})")(?<!\\.js")/';

Live Demo

答案 3 :(得分:0)

修改

请参阅:https://stackoverflow.com/a/18838123/1163653以获得更好的解决方案。

修正了它:

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js"|").)*"/

请注意,前瞻是检查不包含.js "的任何字符串(在域之后),这两种字符串都会导致其无效。它允许href以[{1}}结尾,因为它们只有在到达第一个.css时才会失败,这是所需的行为。