Я пытаюсь "извлечь" часть ссылки из сообщения твита:
$tweet = "Testing a tweet with a link https://t.co/h4C0aobVnK in the middle"
У меня есть функция, которая не совсем работает, но я не знаю, почему. Мне нужно получить часть ссылки, поэтому мне нужно все между https://
и space
В результате я хочу: t.co/h4C0aobVnK
Это функция:
function dataBetween($string, $start, $end){
$sp = strpos($string, $start)+strlen($start);
$ep = strpos($string, $end)-strlen($start);
$data = trim(substr($string, $sp, $ep));
return trim($data);
}
Вот как это называется:
$link = dataBetween($tweet,'https://',' ');
Но результат, который я получаю, - это не то, что я ожидал:
t.co/h4C0aobVnK in the middl
Где я неправ?
Есть ли лучший способ извлечь часть ссылки из $tweet
? Он всегда начинается с https://.
Для этого вы должны использовать регулярные выражения. Это может показаться сложным, но как только вы начнете использовать их, нет возврата. ;)
preg_match_all("/https:\/\/(.*?)\s/", $string, $matches);
print_r($matches);
$ep = strpos($string, $end)-strlen($start);
изменить на
$ep = strpos($string, $end)-strlen($end);
Просто ошибочность.
Хорошо, измените это:
$ep = strpos($string, $end)-strlen($start);
Для того, чтобы:
$ep = strpos($string, $end, $sp) - strlen($string);
Передавая третий параметр strpos (offset), он начнется с того места, где была начата ссылка, и после этого получит первый "".
использование
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME
if(preg_match("/^$regex$/", $tweet , $m))
var_dump($m);
strpos находит первое вхождение строки. Для $ ep, вы должны начать искать ПОСЛЕ $ sp, а не с начала строки
$ep = strpos($string, $sp)-strlen($end);
Кроме того, вы можете использовать регулярное выражение, подобное этому: www://([^] +) | я * http не разрешено в поле комментариев, поэтому просто замените ww тем