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

Мне нужно получить имя пользователя из ссылающегося URL (только если реферер начинается с «/ members /» после имени хоста.

То, что у меня в данный момент не работает, но как это можно изменить, чтобы получить имя пользователя из URL?

// 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);
}
}

2

Решение

Ты можешь использовать parse_url() разбить URL, а затем сопоставить его с preg_match():

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

Другие решения

Я бы сделал это —

$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];
}

Вот пример.

1

Вы можете использовать комбинацию 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
}
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ОП забыл установить $startpos + 1так что это не соответствует / на подстроке /member/, но на следующий символ.

Любые сомнения, я свободен ответить на них.

0
По вопросам рекламы [email protected]