จะรับพารามิเตอร์จากสตริง 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 / ค่าเหล่านี้ได้อย่างไร

โปรดทราบว่าฉันไม่ได้รับสายเหล่านี้จากแถบที่อยู่ของเบราว์เซอร์


ฉันสับสนเล็กน้อยโปรดอธิบายคำถาม ...
Dexter Huinda

คุณกำลังพูด / ขอ URL ให้ถือว่าเป็นสตริงหรือไม่?
hjpotter92

หากคุณต้องการ "จับคู่" ส่วนอีเมลจากสตริงเช่นในตัวอย่างของคุณให้ใช้นิพจน์ทั่วไป อาจจะง่ายเหมือน/(email=\w\@\w\.\w)/หรือมากกว่าเทคนิคการจับคู่ขั้นสูง เพียงแค่ให้ความคิดกับคุณ ดูpreg_matchฟังก์ชั่น: php.net/manual/en/function.preg-match.php
Dexter Huinda


ซ้ำกันที่เป็นไปได้ของรับสตริงการสืบค้น URL
jww

คำตอบ:


415

คุณสามารถใช้parse_url()และparse_str()เพื่อที่

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

หากคุณต้องการรับ$urlPHP แบบไดนามิกลองดูคำถามนี้:

รับ URL แบบเต็มใน PHP


2
มันทำงานได้ แต่ฉันได้รับข้อผิดพลาดในบันทึกเช่นนี้: PHP ประกาศ: ดัชนีไม่ได้กำหนด: แบบสอบถาม
Srinivas08

113

พารามิเตอร์ทั้งหมดหลังจาก?สามารถเข้าถึงได้โดยใช้$_GETอาร์เรย์ ดังนั้น,

echo $_GET['email'];

จะแยกอีเมลจาก URL


50
นี่ไม่ใช่คำตอบสำหรับคำถาม แต่นี่คือคำตอบที่ฉันค้นหาเมื่อฉันถาม Googles สำหรับคำถามดังนั้น +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
OP กล่าวว่าเขาจะไม่ได้รับ URL address barจาก URL เหล่านี้เป็นเพียงINการ จำกัด รหัส
DavChana

7

คุณสามารถใช้รหัสด้านล่างเพื่อรับที่อยู่อีเมลได้ไหม ใน URL

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


3
OP ขอให้แตกตัวแปรออกจากสตริงไม่ใช่ 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

นอกจากนี้คุณสามารถทำผลงานนี้โดยใช้regex

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
คุณช่วยลองอธิบายรายละเอียดเพิ่มเติมได้ไหม เป็นการยากที่จะเข้าใจความหมายของคำตอบข้างต้น
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

คำตอบที่ปลอดภัยมากขึ้นที่ฉันประหลาดใจยังไม่ได้กล่าวถึงที่นี่:

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 จำนวนมากคุณสามารถใช้การวนซ้ำเพื่อรับพารามิเตอร์ 'อีเมล' จากสตริง URL เหล่านั้นทั้งหมดและเก็บไว้ในอาร์เรย์


1
ฉันไม่ได้รับสายเหล่านี้จากแถบที่อยู่ของเบราว์เซอร์แต่คุณโพสต์วิธีแก้ปัญหาสำหรับมัน
โมฮัมหมัด

OP ถามถึง PHP ไม่ใช่ JavaScript
Jacob Alvarez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.