3

我正在对 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

4 回答 4

3

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

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)*?"/
于 2013-09-16T22:08:17.867 回答
2

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

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

将其编译为这个:

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

现场演示

于 2013-09-16T23:48:34.403 回答
1

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

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

按照这个规则

于 2013-09-16T22:43:09.523 回答
0

编辑

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

修复:

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

请注意,前瞻正在检查任何不包含.js or "的字符串(在域之后) ,这两者都会导致它无效。它允许 href 以 through 结尾,.css因为它们仅在到达 first 时才会失败",这是所需的行为。

于 2013-09-16T22:09:42.267 回答