我正在尝试使用此正则表达式#^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;
答案 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]之类的否定类始终匹配换行符,与此修饰符的设置无关。