我尝试从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?
验证这一点答案 0 :(得分:0)
我现在为自己修理了
#(?:^|\s|\()((?:www\.|https?:(?:\/\/)).*?\..*?)(?:\s|\)|$)#im
“m”修饰符修复了^ ... $问题。