Я пытаюсь получить URL-адрес твита, если он найден, в сообщении с этим регулярным выражением #^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;
Причина, по которой это не сработает, как вы ожидаете, заключается в том, что вы включаете анкеры в вашем регулярном выражении, которое обозначает, что шаблон должен совпадать от начала до конца.
Удаляя якоря, это соответствует …
$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);
}
Приведенный выше код дает нам …
массив (4) { [0] => string (55) "https://twitter.com/itslifeme/status/765268556133064704" [1] => строка (9) "itslifeme" [2] => строка (0) "" [3] => строка (18) "765268556133064704"}
Кроме того, нет никакой причины включать модификатор dot all pattern в вашем выражении.
с (
PCRE_DOTALL
)Если этот модификатор установлен, метасимвол точки в шаблоне соответствует всем символам, включая символы новой строки. Без этого новые строки исключаются. Этот модификатор эквивалентен модификатору Perl’s / s. Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от установки этого модификатора.
Других решений пока нет …