谷歌Analytics(分析)不允许负向前查找了它的过滤器内。 这被证明是非常困难的创建自定义报告只包括我想它包含的链接。
包括负先行如果启用,将工作的正则表达式为:
test.com(\/\??index\_(.*)\.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
这符合:
test.com
test.com/
test.com/index_fb2.php
test.com/index_fb2.php?ref=23
test.com/index_fb2.php?ref=23&e=35
test.com/?ref=23
test.com/?ref=23&e=35
和不匹配(因为它应该):
test.com/ambassadors
test.com/admin/?signup=true
test.com/randomtext/
我期待找出如何适应我的正则表达式来仍持有相同的匹配,但无需使用负先行的。
谢谢!
谷歌Analytics(分析)似乎并不支持单和多行模式,这对我来说很有意义。 网址不能包含换行符,所以如果点不匹配他们来说并不重要,从未有任何需要^
和$
任何地方匹配,但一开始,整个字符串的结尾。
这意味着(?!.)
在你的正则表达式是完全等同于$
,只在字符串的结尾处(如匹配\z
,以支持它的味道)。 由于这是在你的正则表达式的唯一先行,你不应该有这样的问题; 你应该一直在使用$
所有一起。
但是,您正则表达式有其他的问题,主要是由于过度依赖(.*)
例如,它匹配这些字符串:
test.com/?^#(%)!*%supercalifragilisticexpialidocious
test.com/index_ecky-ecky-ecky-ecky-PTANG!-vroop-boing_rowr.php (ni! shh!)
......我敢肯定你不想。 :P
试试这个正则表达式:
test\.com(?:/(?:index_\w+\.php)?(?:\?ref=\d+(?:&e=\d+)?)?)?\s*$
或者其可读性:
test\.com
(?:
/
(?:index_\w+\.php)?
(?:
\?ref=\d+
(?:
&e=\d+
)?
)?
)?
\s*$
为了便于说明我做了很多简化有关(例如)哪些参数可以存在,什么样的顺序,他们将出现在假设,以及他们的值即可。 我也想知道,如果真的有必要以匹配域名( test.com
)。 我与谷歌Analytics(分析)没有经验,但不应该在比赛开始(和锚定)域后,对不对? 那你真的要允许在年底的空白? 在我看来,正则表达式应该是更多这样的:
^/(?:index_\w+\.php)?(?:\?ref=\d+(?:&e=\d+)?)?$
首先,我觉得你的正则表达式需要一些固定。 让我们来看看你有什么:
test.com(\/\??index_.*.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
在您使用可选的情况下?
在开始index...
已经由第二替代照顾:
test.com(\/index_.*.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
现在,你可能只需要第一(.*)
被允许,如果确实是文字?
之前。 否则,你将匹配test.com/index_fb2.phpanystringhereandyouprobablydon'twantthat
。 因此,移动相应的可选标志:
test.com(\/index_.*.php(\?(.*))?|\/\?(.*)|\/|)+(\s)*(?!.)
现在.*
消耗任何字符,并尽可能多地。 此外, .
在前面的php
消耗任何字符。 这意味着你将同时允许test.com/index_fb2php
和test.com/index_fb2.html?someparam=php
。 让我们作出这样的文字.
并且只允许非问号字符:
test.com(\/index_[^?]*\.php(\?(.*))?|\/\?(.*)|\/|)+(\s)*(?!.)
现在,第一,第二和第三个选项可以折叠成一个,如果我们把文件名可选,太:
test.com(\/(index_[^?]*\.php)?(\?(.*))?|)+(\s)*(?!.)
最后, +
可以去掉,因为(.*)
内已经可以照顾所有可能的重复。 也(something|)
是一样的(something)?
:
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*(?!.)
看到你输入的例子,这似乎是更接近你真正想要匹配的内容。
然后回答你的问题。 什么(?!.)
不取决于你是否使用singleline
模式与否。 如果你这样做,它声称已到达字符串的结尾。 在这种情况下,你可以简单地替换\Z
,这始终是字符串的结尾相匹配。 如果不这样做的话,就断言你已经达到了一个行的末尾。 在这种情况下,你可以使用$
,但你也需要使用多行模式,使$
匹配行结束了。
所以,如果你使用singleline
模式(这可能意味着你必须每串仅一个URL),使用此:
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*\Z
如果你不使用singleline
模式(这可能意味着你可以有自己的行多个URL),你也应该使用multiline
模式,这种锚,而不是:
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*$