2013-07-25 56 views
1

我想每個字符串(URL)開始「串」,並在沒有結束匹配 - [數字]正則表達式匹配不起作用

所以我做了這個表達式

string/?.*(?!-[0-9]*) 
後每是以「串」,有可能是「/」

匹配它,有任何字符串後,不包括「 - 」:

其中,對我的理解,應該被理解爲其次是任何 號碼或號碼。

這裏是我的測試串

string/kkk/aaa/sss/ddd-123 
string/kkk/aaa/sss/ddd 
string/kkk/aaa/sss 
string/kkk/aaa 
string/kkk 
string/ 
string/kkk/ 
string/kkk/aaa/ 
string/74002 

正則表達式匹配剛剛的一切,不管是什麼。

有人能告訴我我哪裏出了錯?

回答

2

在你表達你的面前,在加入.* 。在先行

這意味着*將跳過所有可用字符匹配.在進行下一步之前 - 這在本質上就是一切,因此你的表達式匹配一切這通常用於當你想退役在一個模式之後鑄造一切。

您需要將.*移入先行語句或使用非貪婪版本。

嘗試像

^string/?(?!.+?-\d+$).* 

以上將匹配不-和數字結尾的字符串。它還會返回匹配模式的實例的整個字符串。我在這裏使用了非貪婪.+?以避免混淆以及添加^ start和$行尾選擇器。如果模式成功,則.*匹配所有字符。

+0

謝謝,它完美的作品! –

0

試試這個:

$str = "string/kkk/aaa/sss/ddd123"; 
echo preg_match("/^string\/(?!.*-\d+$)/",$str); 
0

你的問題是你不要逼正則表達式的整個字符串相匹配。

例如,走這條線:

string/kkk/aaa/sss/ddd-123 

在這種情況下.*string/後只會匹配一切,包括-123。非貪婪的匹配將匹配除d-123之外的所有內容。在任何一種情況下,它都不能找到負向預測中給出的內容。

你必須迫使正則表達式的字符串結束($)(也可能是字符串開始(^匹配),以及:

^string/?.*(?!-[0-9]*)$ 
相關問題