2012-06-17 27 views
2

末這是文本樣本:PHP正則表達式:匹配文本的URL,直到空間或字符串

$text = "asd dasjfd fdsfsd http://11111.com/asdasd/?s=423%423%2F gfsdf http://22222.com/asdasd/?s=423%423%2F 
asdfggasd http://3333333.com/asdasd/?s=423%423%2F"; 

這是我的正則表達式:

preg_match_all("#http:\/\/(.*?)[\s|\n]#is", $text, $m); 

匹配前兩個網址,但如何我匹配最後一個嗎?我嘗試添加[\ s | \ n | $],但這也只能匹配前兩個網址。

+0

沒有工作。不管什麼意思。我很確定這個模式總是有效的。 – hakre

+0

@hakre它不符合第三個網址,只有前兩個。 –

+0

在'()'中使用'|'而不是在'[]'中使用*或*。你試過了:'(\ s | \ n | $)'或'(?:\ s | \ n | $)'? ('?:'使得組不匹配) - 也可以爲'$ text'添加一個空格;) – hakre

回答

2

不要試圖匹配\n(這裏沒有換行符!),而是使用$(它將匹配字符串的末尾)。

編輯: 我很想聽聽爲什麼我最初的想法不起作用,所以如果你知道它,讓我知道。我猜想,因爲[]試圖匹配一個字符,而行結束不是一個? :)

這一個將工作:

preg_match_all('#http://(\S+)#is', $text, $m); 

注意,你沒有逃跑的/因爲他們沒有被分隔字符,但你不得不逃離\爲你」重新使用雙引號(所以字符串被解析)。相反,我爲此使用了單引號。

+0

「#http:\/\ /(。*?)[\ s | \ n | $]#is」與我的第三個網址不符。 –

+0

有趣的是,現在嘗試它。它確實不匹配(同上;如上所述; |已經過時(並且被解釋爲'[]'中的另一個可能的值) – Mario

+0

在方括號內,'$'匹配文字'$',就像' |'匹配一個字符'|',您需要查找'(\ s | $)',因爲@dsrekab建議('\ n'是多餘的,因爲它是'\ s'匹配的字符之一)。但我認爲你現在做的方式更好。 –

0

我不熟悉PHP,所以我沒有確切的語法,但也許這會給你一些嘗試。 []意味着一個字符類,所以| $會逐字查找$。我想你需要的是另一種向前看所以是這樣的:

#http:\/\/(.*)(?=(\s|$)) 

我道歉,如果這是路要走,但也許它會給你另一個角度去嘗試。