在PHP中的两个子字符串之间获取字符串?

时间:2014-12-17 15:09:11

标签: php string substring strpos referrer

我需要从引荐网址获取用户名(仅当引荐来源以" / members /&#34开头;仅在主机名之后。

我目前无法正常工作,但如何修改以从网址获取用户名?

// example URL
// http://domain.com/members/john-doe/something
// note that domain.com or protocol can change

$string = $_SERVER['HTTP_REFERER'];
$start = '/members/';
$end = '/';

$startpos = strpos($string, $start) + strlen($start);

if (strpos($string, $start) !== false) {
    $endpos = strpos($string, $end, $startpos);

   if (strpos($string, $end, $startpos) !== false) {
        echo substr($string, $startpos, $endpos - $startpos);
    }
}

4 个答案:

答案 0 :(得分:4)

您可以使用parse_url()拆分网址,然后将其与preg_match()匹配:

if (preg_match('~^/members/([^/]+)~', parse_url($string, PHP_URL_PATH), $matches)) {
    // path starts with "/members/"
    // $matches[1] is the user name
}

答案 1 :(得分:1)

我会这样做 -

$url = 'http://domain.com/members/john-doe/something';
$urlParts = explode('/', $url); // get all parts of te url
if('members' == $urlParts[3]) { // test and display
    echo $urlParts[4];
}

这是example

答案 2 :(得分:0)

您可以使用parse_url()pathinfo()的组合:

$pathDir = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_DIRNAME);
$directories = explode('/', $pathDir);

if(array_search('members', $directories) !== false) {
    // perform your magic
}

答案 3 :(得分:0)

这是我提出的代码:

$string = $_SERVER['HTTP_REFERER'];
$start = '/members/';
$end = '/';

$startpos = strpos($string, $start);

if ($startpos !== false) {
    $endpos = strpos($string, $end, ($startpos += strlen($start)) + 1);

   if ($endpos !== false) {
        echo substr($string, $startpos, $endpos - $startpos );
    }
}

它基于OP的代码,但我已经实现了一些修复。

在第3个和第4个strpos,OP忘记设置$startpos + 1,因此它与子字符串/上的/member/不匹配,但在下一个字符。

有任何疑问,我可以自由回答。