我有一个由网址组成的字符串,由<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>
答案 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);