首先,我認爲你的正則表達式需要一些修復。讓我們來看看你有什麼:
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
模式(這可能意味着你可以有多個網址對自己的行),你也應該使用multiline
模式,這種錨,而不是:
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*$
非常感謝您提供詳細的答案,但Google Analytics(分析)顯示的結果爲零。我似乎也無法讓它在在線正則表達式檢查器上工作:http://regexr.com?32pr7 – eiso
在測試儀中,您應該使用我的第一個正則表達式或從每個URL中刪除'test \ .com' 。您還需要打開多行模式並擺脫添加到正則表達式結尾的空間。它仍然不符合'test.com/?ref = 23'這一行,因爲它最後也有一個空格。 (這在GA中有效嗎?我懷疑不是。) –
我明白了!我想最後的空間是問題所在。非常感謝你!通過GA中的這份定製報告,您每週都爲我節省了大量時間,並且我學到了很多關於正則表達式的知識。 – eiso