正则表达式 - 字符串以<br/>结尾

时间:2014-10-23 19:20:29

标签: php regex

我有一个由网址组成的字符串,由<br>标记分隔。我正在使用此正则表达式来匹配网址:/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/g

以上匹配整个字符串,这不是我想要的。我需要没有标签的网址。

我尝试将(\/\S*)替换为(<br>\/\S),但会返回错误的结果。

什么是正确的解决方案?

示例网址列表:

http://www.google.com/explearning/4a1f519153c809a424ee2d3ed93b685a<br>http://www.google.com/explearning/e3fa4315175288ea85b7682c34d9f504<br>http://www.google.com/explearning/e818d4fd6d546844d63fb9e160cf046e<br>http://www.google.com/explearning/5d4c6b570e6bfa918b7b4be14cc41a42<br>http://www.google.com/explearning/adf3d853c1bb4f5f30efc64802c30d75<br>

1 个答案:

答案 0 :(得分:1)

从字符串中提取网址的最佳方法是使用explode,然后,如果要测试每个部分是否为有效网址,可以使用FILTER_VALIDATE_URL,例如:

$parts = explode('<br>', $yourstring);
$urls = array();

foreach($parts as $part) {
    if(filter_var($part, FILTER_VALIDATE_URL))
        $urls[] = $part;
}

如果您想检查您的字符串是否仅由使用<br>标记分隔的网址组成,您只需要将$parts长度与$urls长度进行比较。如果两个长度相等,则字符串可以是您想要的。 但是你可以使foreach循环更高效。如果某个部件不是网址,则可以停止foreach循环:

$parts = explode('<br>', $yourstring);
$urls = array();

foreach($parts as $part) {
    if(filter_var($part, FILTER_VALIDATE_URL))
        $urls[] = $part;
    else break;
}

if (count($parts) == count($urls))
    print_r($urls);