PHP从未知字符前后的url获取特定字符串

时间:2013-06-06 09:06:23

标签: php regex preg-match

我知道这听起来像是一个常见的问题,但我很难理解这个过程。 所以我有这个字符串:

http://domain.com/campaign/tgadv?redirect

我只需要“tgadv”这个词。但我不知道这个词是“tgadv”,它可能是什么。

此外,网址本身可能会改变并变为:

http://domain.com/campaign/tgadv

http://domain.com/campaign/tgadv/

所以我需要的是创建一个函数,在任何其他特定字符之前之前之前的任何单词。这是逻辑...... 唯一可以肯定的是,这个词会出现在 campaign / 之后,并且在我们搜索的单词之后的任何其他字符都是特殊字符(即/或?)

我尝试了解preg_match,但实际上无法从中获得任何好结果。

任何帮助都将受到高度赞赏!

5 个答案:

答案 0 :(得分:1)

我不会使用正则表达式。我会使用parse_urlbasename

$bits =  parse_url('http://domain.com/campaign/tgadv?redirect');
$filename = basename($bits['path']);
echo $filename;

但是,如果想要一个正则表达式解决方案,请使用以下内容:

$pattern = '~(.*)/(.*)(\?.*)~';
preg_match($pattern, 'http://domain.com/campaign/tgadv?redirect', $matches);
$filename = $matches[2];
echo $filename;

答案 1 :(得分:0)

实际上,preg_match听起来像是这个问题的完美解决方案。我假设你正在使用正则表达式的问题?

尝试这样的事情:

<?php
$url = "http://domain.com/campaign/tgadv/";
$pattern = "@campaign/([^/\?]+)@";
preg_match($pattern, $url, $matches);

// $matches[1] will contain tgadv.

答案 2 :(得分:0)

$path = "http://domain.com/campaign/tgadv?redirect";
$url_parts = parse_url($path);
$tgadv = strrchr($url_parts['path'], '/');

答案 3 :(得分:0)

你真的不需要正则表达式来实现这一目标。您可以使用stripos()substr()来完成此操作。

例如:

$str = '....Your string...';
$offset = stripos($str, 'campaign/');
if ( $offset === false ){
    //error, end of h4 tag wasn't found
}
$offset += strlen('campaign/');
$newStr = substr($str, $offset);

此时$ newStr将包含'campaign /'之后的所有文字。

然后,您只需要使用类似的过程来查找特殊字符位置,并使用substr()去除您想要的字符串。

答案 4 :(得分:0)

在这种情况下你也可以使用好的旧字符串函数,不需要涉及regexp。

首先找到字符串/campaign/,然后将子字符串包含在其后的所有内容(tgadv/asd/whatever/?redirect),然后在字符串开头后找到下一个/? ,介于两者之间的一切都将是你所需要的(tgadv)。