为什么preg_match得不到结果


Why preg_match fails to get the result?

我在浏览器上显示了以下文本,并试图从字符串中获取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

在这种情况下,我认为parse_url比基于正则表达式的代码更好。这样的东西可能会起作用(假设您的 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"
}

据我了解您的要求,这里有一种方法可以做到:

$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
)