为什么preg_match无法获得结果?

时间:2011-05-13 11:33:42

标签: php

我在浏览器上显示以下文本并尝试从字符串中获取URL。

字符串1 =来自#switzerland的语音转文字:http://bit.ly/lnpDC12D

当我尝试使用preg_match并尝试获取URL时,但它失败了

$urlstr = "";
preg_match('/\b((?#protocol)https?|ftp):\/\/((?#domain)[-A-Z0-9.]+)((?#file)\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?((?#parameters)\?[A-Z0-9+&@#\/%

=~_|!:,.;]*)?/i', $urlstr, $match);

echo $match[0];

我认为#switzerland:还有一个http // ...会不会有问题?

以上分割适用于以下字符串,

语音转文字:http://bit.ly/jDcXrZg

2 个答案:

答案 0 :(得分:1)

在这种情况下,我认为parse_url将是比基于正则表达式的代码更好的选择。这样的事情可能会起作用(假设您的网址始终以http 开头):

$str = "voice-to-text from #switzerland: http://bit.ly/lnpDC12D";
$pos = strrpos($str, "http://");
if ($pos>=0) {
   var_dump(parse_url(substr($str, $pos)));
}

输出

array(3) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(6) "bit.ly"
  ["path"]=>
  string(9) "/lnpDC12D"
}

答案 1 :(得分:0)

据我了解您的要求,这是一种方法:

$str = 'voice-to-text from <a href="search.twitter.com/…;: http://bit.ly/lnpDC12D';
preg_match("~(bit.ly/\S+)~", $str, $m);
print_r($m);

<强>输出:

Array
(
    [0] => bit.ly/lnpDC12D
    [1] => bit.ly/lnpDC12D
)