正则表达式:从URL中提取推文用户名和ID

时间:2016-08-24 18:44:12

标签: php json regex tweets

我正在尝试使用此正则表达式#^https?://twitter\.com/(?:\#!/)?(\w+)/status(es)?/(\d+)$#is

在邮件中获取推文网址(如果找到)

但是看起来我的正则表达式对于获取推文URL是不正确的。以下是我的完整代码

function gettweet($string)
{
    $regex = '#^https?://twitter\.com/(?:\#!/)?(\w+)/status(es)?/(\d+)$#is';
    $string = preg_replace_callback($regex, function($matches) {
        $user = $matches[2];
        $statusid = $matches[3];
        $url = "https://twitter.com/$user/status/$statusid";
        $urlen = urlencode($url);
        $getcon = file_get_contents("https://publish.twitter.com/oembed?url=$urlen");
        $con = json_decode($getcon, true);
        $tweet_html = $con["html"];
        return $tweet_html;
    }, $string);
    return $string;
}

$message="This is absolutely trending can you also see it here https://twitter.com/itslifeme/status/765268556133064704 i like it";
$mes=gettweet($message);
echo $mes;

1 个答案:

答案 0 :(得分:2)

这不会像您期望的那样工作的原因是因为您在正则表达式中包含anchors,这表示该模式必须从头到尾匹配。

通过移除锚点,它匹配......

$regex  = '#https?://twitter\.com/(?:\#!/)?(\w+)/status(es)?/(\d+)#is';
$string = "This is absolutely trending can you also see it here https://twitter.com/itslifeme/status/765268556133064704 i like it";

if (preg_match($regex, $string, $match)) {
    var_dump($match);
}

上面的代码给了我们......

array(4) {
  [0]=>
  string(55) "https://twitter.com/itslifeme/status/765268556133064704"
  [1]=>
  string(9) "itslifeme"
  [2]=>
  string(0) ""
  [3]=>
  string(18) "765268556133064704"
}

此外,我们没有理由在您的表达中加入dot all pattern modifier

  

s(PCRE_DOTALL

     

如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,排除了换行符。此修饰符等效于Perl&#s; s修饰符。诸如[^ a]之类的否定类始终匹配换行符,与此修饰符的设置无关。