在两个不同的分隔符之间获取子字符串

时间:2014-11-10 15:22:20

标签: php trim strpos

我正在尝试"提取"来自推文消息的链接部分:

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

开头

5 个答案:

答案 0 :(得分:1)

您应该使用正则表达式。这可能看起来很复杂,但是一旦你开始使用它们,就没有回头路了。 ;)

preg_match_all("/https:\/\/(.*?)\s/", $string, $matches);
print_r($matches);

答案 1 :(得分:0)

strpos查找第一次出现的字符串。对于$ ep,您应该开始查看$ sp之后,而不是从字符串的开头

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

另外,你可以使用像这样的正则表达式| www://([^] +)| i *评论框中不允许使用http,因此只需将ww替换为

即可

答案 2 :(得分:0)

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

更改为

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

只是一个错误的类型。

答案 3 :(得分:0)

使用

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

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

答案 4 :(得分:0)

好吧,改变一下:

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

要:

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

传递strpos(偏移量)的第三个参数,它将从链接开始的位置开始,并获得第一个参数。 '之后。

Working code