1

我有这个简单的虚拟文本

<base href="http://wjbty.lc/"/?
<a href="common/home" />
<a href="common/home" />
<a href="/common/home" />
<a href="http://common/home" />
<a href="https://common/home" />
<a href="common/home" />

我的正则表达式模式是(?:(href="))(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)"

并且它工作正常并匹配所有相关链接,但它始终包含href="在结果匹配中。

以及如何href="从结果中排除。任何人都可以测试它,然后请回答,因为有两个答案,但没有一个有效。

正则表达式伙伴中的输出

4

3 回答 3

5

在您的表达式中,您有一组额外的括号

(?:(href="))

它应该是

(?:href=")

编辑:我想你想要这个

/(?:href=")(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)"/

所以它也不会捕获关闭引号。还要记住 preg_match_all 返回一个数组或数组第一个数组集是总捕获。第二个数组集是组捕获(你想要的)

额外参数

flags 参数可以是 PREG_PATTERN_ORDER 或 PREG_SET_ORDER

PREG_PATTERN_ORDER 表示 array[0] 将是所有捕获信息,而 array[1] 将是您在括号中捕获的信息。

PREG_SET_ORDER 表示每次匹配都会有一个数组元素,match[0] 是总信息,match[1] 是捕获组。

于 2013-09-23T07:58:22.643 回答
1

另一种方法是使用该功能从匹配结果\K中排除与模式开头(直到 )匹配的子字符串。\K例子:

\shref="\K(?!(?:https?:/)?/)[^"]+

建议:如果您使用斜杠作为模式分隔符,则必须转义模式中的斜杠,但使用其他字符是更好的选择,例如~.

请注意,您根本不需要捕获组,因为您想要获得的是整个匹配。

如果你需要它,你可以在模式的末尾添加一个前瞻来检查结束双引号的存在:(?=")

于 2014-04-02T19:53:58.997 回答
1

如果您想使用前瞻和后视,这应该是您的答案:

(?<=href=")(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)(?=\")

在这里演示:http ://regex101.com/r/gS8iR6

于 2014-04-03T06:05:28.257 回答