Regex: извлекать твиттер имя пользователя и идентификатор из URL

Я пытаюсь получить 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;

1

Решение

Причина, по которой это не сработает, как вы ожидаете, заключается в том, что вы включаете анкеры в вашем регулярном выражении, которое обозначает, что шаблон должен совпадать от начала до конца.

Удаляя якоря, это соответствует …

$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], всегда соответствует символу новой строки, независимо от установки этого модификатора.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]