PHP正则表达式:匹配文本URL直到空格或字符串结尾

时间:2012-06-17 18:18:13

标签: php regex parsing preg-match preg-match-all

这是文本示例:

$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 | $],但这也只匹配前两个网址。

3 个答案:

答案 0 :(得分:2)

不要试图匹配\n(毕竟没有换行符!)而是使用$(它将匹配字符串的结尾)。

编辑: 我很想知道为什么我最初的想法不起作用,所以万一你知道,请告诉我。我猜是因为[]试图匹配一个字符,而行尾不是一个? :)

这个会起作用:

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

请注意,您不必转义/因为它们不是分隔符,但是您必须转义\,因为您正在使用双引号(因此解析字符串) 。相反,我使用单引号。

答案 1 :(得分:0)

我不熟悉PHP,所以我没有确切的语法,但也许这会给你一些尝试。 []表示一个字符类,所以| $将逐字寻找$。我认为你需要的是另一个向前看,所以这样的事情:

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

如果有这种情况,我道歉,但也许它会给你另一个尝试的角度。

答案 2 :(得分:0)

请参阅What is the best regular expression to check if a string is a valid URL?

它有一些很长的正则表达式,可以匹配所有网址。