2

这是文本示例:

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

4

3 回答 3

3

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

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

这将起作用:

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

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

于 2012-06-17T18:22:38.330 回答
0

我不熟悉 PHP,所以我没有确切的语法,但也许这会给你一些尝试。[] 表示一个字符类,因此 |$ 将按字面意思查找 $。我认为您需要的是另一种展望,如下所示:

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

如果这太离谱了,我深表歉意,但也许它会给你另一个尝试的角度。

于 2012-06-17T18:26:06.893 回答
0

请参阅检查字符串是否为有效 URL 的最佳正则表达式是什么?

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

于 2012-06-17T22:50:15.940 回答