Получение подстроки между двумя разными разделителями

0

Я пытаюсь "извлечь" часть ссылки из сообщения твита:

$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://.

Теги:
trim
strpos

5 ответов

1
Лучший ответ

Для этого вы должны использовать регулярные выражения. Это может показаться сложным, но как только вы начнете использовать их, нет возврата. ;)

preg_match_all("/https:\/\/(.*?)\s/", $string, $matches);
print_r($matches);
0
   $ep = strpos($string, $end)-strlen($start);

изменить на

$ep = strpos($string, $end)-strlen($end);

Просто ошибочность.

0

Хорошо, измените это:

$ep = strpos($string, $end)-strlen($start);

Для того, чтобы:

$ep = strpos($string, $end, $sp) - strlen($string);

Передавая третий параметр strpos (offset), он начнется с того места, где была начата ссылка, и после этого получит первый "".

Рабочий код

0

использование

$regex = "((https?|ftp)\:\/\/)?"; // SCHEME

 if(preg_match("/^$regex$/", $tweet , $m))
  var_dump($m);
0

strpos находит первое вхождение строки. Для $ ep, вы должны начать искать ПОСЛЕ $ sp, а не с начала строки

$ep = strpos($string, $sp)-strlen($end);

Кроме того, вы можете использовать регулярное выражение, подобное этому: www://([^] +) | я * http не разрешено в поле комментариев, поэтому просто замените ww тем

Ещё вопросы

Сообщество Overcoder
Наверх
Меню