Làm cách nào để lấy tham số từ chuỗi URL?


197

Tôi có một trường biểu mẫu HTML $_POST["url"]có một số chuỗi URL làm giá trị. Giá trị mẫu là:

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

Vân vân.

Làm cách nào tôi chỉ có thể nhận được emailtham số từ các URL / giá trị này?

Xin lưu ý rằng tôi không nhận được các chuỗi này từ thanh địa chỉ trình duyệt.


Tôi hơi bối rối, xin vui lòng giải thích Q ...
Dexter Huinda

Bạn đang nói / yêu cầu các URL được coi là chuỗi?
hjpotter92

Nếu bạn muốn "khớp" phần email từ các chuỗi, như trong ví dụ của bạn, hãy sử dụng các biểu thức thông thường. Có thể đơn giản như /(email=\w\@\w\.\w)/hoặc kỹ thuật kết hợp nâng cao hơn. Chỉ cần cho bạn ý tưởng. Xem preg_matchchức năng: php.net/manual/en/function.preg-match.php
Dexter Huinda


Có thể trùng lặp của Nhận URL chuỗi truy vấn
jww

Câu trả lời:


414

Bạn có thể sử dụng parse_url()parse_str()cho điều đó.

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

Nếu bạn muốn có được sự linh hoạt $urlvới PHP, hãy xem câu hỏi này:

Nhận URL đầy đủ trong PHP


2
nó hoạt động nhưng tôi đang gặp lỗi trong các bản ghi như thế này: PHP Thông báo: Chỉ mục không xác định: truy vấn
Srinivas08

112

Tất cả các tham số sau ?có thể được truy cập bằng cách sử dụng $_GETmảng. Vì thế,

echo $_GET['email'];

sẽ trích xuất các email từ url.


50
Đây không phải là câu trả lời cho câu hỏi, nhưng đây là câu trả lời tôi đang tìm kiếm khi tôi hỏi Googles cho câu hỏi, vì vậy +1 để trả lời Google chính xác.
BillyNair

1
Điều này có thể không phải là câu trả lời cho câu hỏi mà là cách chính xác và dễ dàng nhất để có được các thông số URL - nếu họ được thiết lập một cách chính xác: https://example.com?email=myemail@example.com $email = $_GET['email']; $email === 'myemail@example.com';
CheddarMonkey

45

Sử dụng các phương thức parse_url ()parse_str () . parse_url()sẽ phân tích một chuỗi URL thành một mảng kết hợp các phần của nó. Vì bạn chỉ muốn một phần của URL, bạn có thể sử dụng phím tắt để trả về giá trị chuỗi chỉ với phần bạn muốn. Tiếp theo, parse_str()sẽ tạo các biến cho từng tham số trong chuỗi truy vấn. Tôi không thích làm ô nhiễm bối cảnh hiện tại, vì vậy việc cung cấp một tham số thứ hai sẽ đặt tất cả các biến vào một mảng kết hợp.

$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

Sử dụng $_GET['email']cho các tham số trong URL. Sử dụng $_POST['email']cho dữ liệu được đăng lên kịch bản. Hoặc sử dụng _$REQUESTcho cả hai. Ngoài ra, như đã đề cập, bạn có thể sử dụng parse_url()chức năng trả về tất cả các phần của URL. Sử dụng một phần gọi là 'truy vấn' - ở đó bạn có thể tìm thấy tham số email của mình. Thông tin thêm: http://php.net/manual/en/feft.parse-url.php


5
OP cho biết anh sẽ không nhận được URL từ address bar. Các URL này chỉ là chuỗi INmã.
DavChana

7

Bạn có thể sử dụng mã dưới đây để có được địa chỉ email sau? trong URL

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


3
OP yêu cầu trích xuất các biến từ một chuỗi chứ không phải URL trong trang hiện tại. parse_url () là câu trả lời đúng giả sử chuỗi được định dạng chính xác.
Bloafer

6

Như đã đề cập trong câu trả lời khác, giải pháp tốt nhất là sử dụng

parse_url()

Bạn cần sử dụng kết hợp parse_url()parse_str().

Các parse_url()URL phân tích cú pháp và gửi lại các thành phần của nó mà bạn có thể nhận được chuỗi truy vấn sử dụng querychìa khóa. Sau đó, bạn nên sử dụng parse_str()chuỗi truy vấn phân tích cú pháp đó và trả về các giá trị thành biến.

$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

Ngoài ra, bạn có thể làm công việc này bằng cách sử dụng regex .

preg_match()

Bạn có thể sử dụng preg_match()để lấy giá trị cụ thể của chuỗi truy vấn từ URL.

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

preg_replace()

Ngoài ra, bạn có thể sử dụng preg_replace()để làm công việc này trong một dòng!

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

3

Tôi đã tạo chức năng từ câu trả lời @Ruel . Bạn có thể sử dụng điều này:

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

Thí dụ:

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

Cảm ơn @Ruel


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

Điều này làm việc rất tốt cho tôi khi sử dụng php


1
Bạn có thể vui lòng cố gắng xây dựng câu trả lời nhiều hơn. Thật khó để có được những gì bạn có ý nghĩa bằng câu trả lời ở trên.
Mustafa Ehsan Alokozay

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

Một câu trả lời an toàn hơn nhiều mà tôi ngạc nhiên chưa được đề cập ở đây:

filter_input

Vì vậy, trong trường hợp câu hỏi, bạn có thể sử dụng câu hỏi này để nhận giá trị email từ URL nhận tham số:

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

Đối với các loại biến khác, bạn sẽ muốn chọn một bộ lọc khác / phù hợp như FILTER_SANITIZE_STRING.

Tôi cho rằng câu trả lời này thực hiện nhiều hơn chính xác những gì câu hỏi yêu cầu - lấy dữ liệu thô từ tham số URL. Nhưng đây là lối tắt một dòng có cùng kết quả như sau:

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

Cũng có thể có thói quen lấy các biến theo cách này.


whooops, đã không thấy dòng câu hỏi cuối cùng về việc không nhận được điều này từ URL ... vẫn để nó ở đây trong trường hợp nó hữu ích cho bất cứ ai.
squarecandy

0

Trong Laravel, tôi đang sử dụng:

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

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

0

Hàm động phân tích url chuỗi và nhận giá trị của tham số truy vấn được truyền trong 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
}

Chức năng gọi để nhận kết quả

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

-3

Để lấy tham số từ chuỗi URL, tôi đã sử dụng hàm sau.

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');

Nếu có nhiều chuỗi URL, thì bạn có thể sử dụng vòng lặp để nhận tham số 'email' từ tất cả các chuỗi URL đó và lưu trữ chúng trong mảng.


1
Tôi không nhận được các chuỗi này từ thanh địa chỉ trình duyệt nhưng bạn đã đăng giải pháp cho nó
Mohammad

OP đã hỏi về PHP, không phải JavaScript
Jacob Alvarez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.