Как получить параметры из строки URL?


199

У меня есть поле формы HTML $_POST["url"]с некоторыми URL-строками в качестве значения. Пример значений:

https://example.com/test/1234?email=xyz@test.com
https://example.com/test/1234?basic=2&email=xyz2@test.com
https://example.com/test/1234?email=xyz3@test.com
https://example.com/test/1234?email=xyz4@test.com&testin=123
https://example.com/test/the-page-here/1234?someurl=key&email=xyz5@test.com

и т.п.

Как я могу получить только emailпараметр из этих URL / значений?

Обратите внимание, что я не получаю эти строки из адресной строки браузера.


Я немного растерялся, пожалуйста, уточните вопрос ...
Декстер Хуинда

Вы говорите / просите, чтобы URL рассматривались как строки?
hjpotter92

Если вы хотите «сопоставить» часть письма из строк, как в ваших примерах, используйте регулярные выражения. Может быть так же просто, как /(email=\w\@\w\.\w)/или более продвинутые методы сопоставления. Просто даю вам идею. Смотрите preg_matchфункцию: php.net/manual/en/function.preg-match.php
Декстер Хуинда


Возможный дубликат строки запроса Get URL
jww

Ответы:


416

Вы можете использовать parse_url()и parse_str()для этого.

$parts = parse_url($url);
parse_str($parts['query'], $query);
echo $query['email'];

Если вы хотите получить $urlдинамически с PHP, взгляните на этот вопрос:

Получить полный URL в PHP


2
это работает, но я получаю сообщение об ошибке в журналах, таких как: Примечание PHP: Неопределенный индекс: запрос
Srinivas08

113

Все параметры после ?могут быть доступны с помощью $_GETмассива. Так,

echo $_GET['email'];

будет извлекать письма из URL.


50
Это не ответ на вопрос, но это ответ, который я искал, когда я задал вопрос Google, поэтому +1 для правильного ответа Google.
BillyNair

1
Это может быть не ответ на вопрос, но это правильный и самый простой способ получить параметры URL - если они установлены правильно: https://example.com?email=myemail@example.com $email = $_GET['email']; $email === 'myemail@example.com';
CheddarMonkey

45

Используйте методы parse_url () и parse_str () . parse_url()проанализирует строку URL в ассоциативный массив его частей. Поскольку вам нужна только одна часть URL, вы можете использовать ярлык для возврата строкового значения только с той частью, которую вы хотите. Далее parse_str()создадим переменные для каждого из параметров в строке запроса. Мне не нравится загрязнять текущий контекст, поэтому предоставление второго параметра помещает все переменные в ассоциативный массив.

$url = "https://mysite.com/test/1234?email=xyz4@test.com&testin=123";
$query_str = parse_url($url, PHP_URL_QUERY);
parse_str($query_str, $query_params);
print_r($query_params);

//Output: Array ( [email] => xyz4@test.com [testin] => 123 ) 

8

Используйте $_GET['email']для параметров в URL. Используйте $_POST['email']для размещения данных в сценарии. Или использовать _$REQUESTдля обоих. Также, как уже упоминалось, вы можете использовать parse_url()функцию, которая возвращает все части URL. Используйте часть под названием «запрос» - там вы можете найти свой параметр электронной почты. Больше информации: http://php.net/manual/en/function.parse-url.php


5
ОП сказал, что не получает URL-адреса address bar. Эти URL являются просто строками INкода.
ДавЧана

7

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

<?php
if (isset($_GET['email'])) {
    echo $_GET['email'];
}


3
ОП запросил извлечение переменных из строки, а не URL на текущей странице. parse_url () - правильный ответ, если строка правильно отформатирована.
Bloafer

6

Как уже упоминалось в другом ответе, лучшее решение использует

parse_url()

Вам нужно использовать комбинацию parse_url()иparse_str() .

parse_url()URL синтаксического анализа и вернуть его компоненты , которые вы можете получить строку запроса с помощью queryключа. Затем вы должны использовать parse_str()эту строку запроса синтаксического анализа и возвращать значения в переменную.

$url = "https://example.com/test/1234?basic=2&email=xyz2@test.com";
parse_str(parse_url($url)['query'], $params);
echo $params['email']; // xyz2@test.com

Также вы можете сделать эту работу с помощью регулярных выражений .

preg_match()

Вы можете использовать, preg_match()чтобы получить конкретное значение строки запроса из URL.

preg_match("/&?email=([^&]+)/", $url, $matches);
echo $matches[1]; // xyz2@test.com

preg_replace()

Также вы можете использовать preg_replace()эту работу в одну строку!

$email = preg_replace("/^https?:\/\/.*\?.*email=([^&]+).*$/", "$1", $url);
// xyz2@test.com

3

Я создал функцию из ответа @Ruel . Вы можете использовать это:

function get_valueFromStringUrl($url , $parameter_name)
{
    $parts = parse_url($url);
    if(isset($parts['query']))
    {
        parse_str($parts['query'], $query);
        if(isset($query[$parameter_name]))
        {
            return $query[$parameter_name];
        }
        else
        {
            return null;
        }
    }
    else
    {
        return null;
    }
}

Пример:

$url = "https://example.com/test/the-page-here/1234?someurl=key&email=xyz5@test.com";
echo get_valueFromStringUrl($url , "email");

Благодаря @Ruel


1
$uri = $_SERVER["REQUEST_URI"];
$uriArray = explode('/', $uri);
$page_url = $uriArray[1];
$page_url2 = $uriArray[2];
echo $page_url; <- see the value

Это прекрасно работает для меня с помощью PHP


1
Можете ли вы попытаться уточнить ответ больше. Трудно понять, что вы подразумеваете под приведенным выше ответом.
Мустафа Эхсан Алокозай

1
$web_url = 'http://www.writephponline.com?name=shubham&email=singh@gmail.com';
$query = parse_url($web_url, PHP_URL_QUERY);
parse_str($query, $queryArray);

echo "Name: " . $queryArray['name'];  // Result: shubham
echo "EMail: " . $queryArray['email']; // Result:singh@gmail.com

1

Гораздо более безопасный ответ, который меня удивляет, здесь еще не упомянут:

filter_input

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

$email = filter_input( INPUT_GET, 'email', FILTER_SANITIZE_EMAIL );

Для других типов переменных вы бы хотели выбрать другой / подходящий фильтр, такой какFILTER_SANITIZE_STRING .

Я предполагаю, что этот ответ делает больше, чем именно то, о чем просит вопрос - получение необработанных данных из параметра URL. Но это однострочный ярлык с тем же результатом:

$email = $_GET['email'];
$email = filter_var( $email, FILTER_SANITIZE_EMAIL );

Также можно привыкнуть к захвату переменных таким образом.


Whooops, не видел последнюю строку вопросов о том, чтобы не получить это из URL ... все еще оставляя это здесь на случай, если это будет полезно для всех.
Squarecandy

0

В Laravel я использую:

private function getValueFromString(string $string, string $key)
{
    parse_str(parse_url($string, PHP_URL_QUERY), $result);

    return isset($result[$key]) ? $result[$key] : null;
}

0

Динамическая функция, которая анализирует строку URL и получает значение параметра запроса, переданного в URL

function getParamFromUrl($url,$paramName){
  parse_str(parse_url($url,PHP_URL_QUERY),$op);// fetch query parameters from string and convert to associative array
  return array_key_exists($paramName,$op) ? $op[$paramName] : "Not Found"; // check key is exist in this array
}

Вызовите функцию, чтобы получить результат

echo getParamFromUrl('https://google.co.in?name=james&surname=bond','surname'); // bond will be o/p here

-3

Чтобы получить параметры из строки URL, я использовал следующую функцию.

var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = decodeURIComponent(window.location.search.substring(1)),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : sParameterName[1];
        }
    }
};
var email = getUrlParameter('email');

Если URL-строк много, то вы можете использовать цикл, чтобы получить параметр 'email' из всех этих строк URL-адресов и сохранить их в массиве.


1
Я не получаю эти строки из адресной строки браузера, но вы опубликовали решение для этого
Мохаммад

ОП спрашивал о PHP, а не о JavaScript
Джейкоб Альварес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.