preg_match_all \ r \ n混淆

时间:2014-03-14 13:55:19

标签: php regex url preg-match-all

我尝试从bbcode文本中提取所有未格式化的网址。 正则表达式应匹配:

1. "^http://xyz.abc$"
2. "(http://xyz.abc)"
3. " http://xyz.abc "

但没有格式化的bbcode网址如[url] http://xyz.abc [/ url]

最终的正则表达式是

#(?:^|\s|\()((?:www\.|https?:(?:\/\/)).*?\..*?)(?:\s|\)|$)#i

在测试时我遇到了一些麻烦,发现问题来自\ r \ n。 例如:

$text = "http://www.url.com/xxx/yyy/1.html
http://www.url.com/xxx/yyy/2.html
http://www.url.com/xxx/yyy/3.html";
//or with \n
//$text = "http://www.url.com/xxx/yyy/1.html\nhttp://www.url.com/xxx/yyy/2.html\nhttp://www.url.com/xxx/yyy/3.html";

preg_match_all('#(?:^|\s|\()((?:www\.|https?:(?:\/\/)).*?\..*?)(?:\s|\)|$)#i', $text, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);

$ matches包含第一个和最后一个网址。

但是\ r \ n

$text = "http://www.url.com/xxx/yyy/1.html\r\nhttp://www.url.com/xxx/yyy/2.html\r\nhttp://www.url.com/xxx/yyy/3.html";

$ matches包含所有网址。为什么它不适用于\ n?

您可以在http://www.functions-online.com/preg_match_all.html

验证这一点

1 个答案:

答案 0 :(得分:0)

我现在为自己修理了

#(?:^|\s|\()((?:www\.|https?:(?:\/\/)).*?\..*?)(?:\s|\)|$)#im

“m”修饰符修复了^ ... $问题。