Bir URL dizesinden parametreler nasıl alınır?


199

$_POST["url"]Değer olarak bazı URL dizeleri olan bir HTML form alanı var . Örnek değerler:

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

vb.

emailBu URL'lerden / değerlerden yalnızca parametreyi nasıl alabilirim ?

Bu dizeleri tarayıcı adres çubuğundan almadığımı lütfen unutmayın.


Biraz kafam karıştı, lütfen Q'yu detaylandırın ...
Dexter Huinda

URL'lerin dize olarak ele alınmasını mı söylüyorsunuz?
hjpotter92

Örneklerinizdeki gibi, e-posta kısmını dizelerden "eşleştirmek" istiyorsanız, normal ifadeler kullanın. /(email=\w\@\w\.\w)/Gelişmiş eşleştirme teknikleri kadar basit olabilir . Sadece sana fikir veriyorum. preg_matchFonksiyona bakın : php.net/manual/tr/function.preg-match.php
Dexter Huinda


Yanıtlar:


415

Bunun için parse_url()ve öğesini kullanabilirsiniz parse_str().

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

$urlPHP ile dinamik olarak almak istiyorsanız , şu soruya bir göz atın:

Tam URL'yi PHP olarak alın


2
onun çalışma ama ben böyle günlüklerde hata alıyorum: PHP Uyarı: Tanımlanmamış dizin: sorgu
Srinivas08

113

Sonra tüm parametrelere dizi ?kullanılarak erişilebilir $_GET. Yani,

echo $_GET['email'];

URL'lerden e-postaları çıkaracak.


50
Bu sorunun cevabı değil, Google'a soruyu sorduğumda aradığım cevaptı, bu yüzden +1 Google'a doğru cevap verdi.
BillyNair

1
Bu sorunun cevabı olmayabilir, ancak URL parametrelerini almanın doğru ve en kolay yoludur - doğru ayarlandıysa:https://example.com?email=myemail@example.com $email = $_GET['email']; $email === 'myemail@example.com';
CheddarMonkey

45

Kullanım parse_url () ve parse_str () yöntemleri. parse_url()bir URL dizesini parçalarının ilişkilendirilebilir bir dizisine ayrıştırır. URL'nin yalnızca tek bir bölümünü istediğiniz için, yalnızca istediğiniz bölümle birlikte bir dize değeri döndürmek için bir kısayol kullanabilirsiniz. Ardından, parse_str()sorgu dizesindeki parametrelerin her biri için değişkenler oluşturur. Geçerli bir bağlamı kirletmeyi sevmiyorum, bu yüzden ikinci bir parametre sağlanması tüm değişkenleri ilişkilendirilebilir bir diziye koyar.

$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'deki parametreler için kullanın . $_POST['email']Gönderilen verilerin komut dosyasına aktarılması için kullanın . Veya _$REQUESTher ikisi için de kullanın . Ayrıca, belirtildiği gibi, parse_url()URL'nin tüm bölümlerini döndüren işlevi kullanabilirsiniz . 'Sorgu' adlı bir bölüm kullanın - orada e-posta parametrenizi bulabilirsiniz. Daha fazla bilgi: http://php.net/manual/en/function.parse-url.php


5
OP, URL'leri almadığını söyledi address bar. Bu URL'ler sadece INkod dizesidir .
DavChana

7

sonra e-posta adresi almak için aşağıdaki kodu kullanabilirsiniz? URL'de

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


3
OP, geçerli sayfadaki URL'den değil, bir dizeden değişkenlerin çıkarılmasını istedi. parse_url (), dizenin doğru biçimlendirildiği varsayılarak verilen doğru yanıttır.
Bloafer

6

Diğer cevapta belirtildiği gibi, en iyi çözüm

parse_url()

Sen kombinasyonunu kullanmak gerekir parse_url()ve parse_str().

parse_url()Ayrıştırma URL ve kullanmakta sorgu dizesi alabilirsiniz bileşenlerine ayırır queryanahtarı. Daha sonra parse_str()bu ayrıştırma sorgu dizesini kullanmalı ve değerleri değişkene döndürmelisiniz.

$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

Ayrıca regex kullanarak bu işi yapabilirsiniz .

preg_match()

preg_match()URL'den sorgu dizesinin belirli bir değerini almak için kullanabilirsiniz .

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

preg_replace()

Ayrıca preg_replace()bu işi tek bir satırda yapmak için kullanabilirsiniz !

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

3

@Yans yanıtından işlev oluşturdum . Bunu kullanabilirsiniz:

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

Misal:

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

@Ruel sayesinde


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

Bu php kullanarak benim için harika çalışıyor


1
Cevabı daha ayrıntılı olarak açıklamaya çalışabilir misiniz? Yukarıdaki cevaptan kastettiğinizi elde etmek zor.
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

Şaşırdığım çok daha güvenli bir cevap burada henüz belirtilmedi:

filter_input

Dolayısıyla, soru söz konusu olduğunda URL get parametrelerinden bir e-posta değeri almak için bunu kullanabilirsiniz:

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

Değişkenlerin diğer türleri için isteyeyim farklı / uygun filtre seçmek gibiFILTER_SANITIZE_STRING .

Bu cevabın tam olarak sorunun ne istediğinden fazlasını yaptığını varsayalım - ham verileri URL parametresinden almak. Ancak bu, aynı sonuçla sonuçlanan tek satırlık bir kısayoldur:

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

Değişkenleri bu şekilde yakalama alışkanlığına girebilir.


whooops, URL'den almama ile ilgili soruların son satırını görmedim ... kimseye yardımcı olması durumunda yine de buradan ayrılıyor.
squarecandy

0

Laravel'de kullanıyorum:

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'ye iletilen dize URL'sini ayrıştıran ve sorgu parametresinin değerini alan dinamik işlev

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
}

Sonuç almak için Çağrı İşlevi

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

-3

URL dizesinden parametre almak için aşağıdaki işlevi kullandım.

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

Çok sayıda URL dizesi varsa, tüm bu URL dizelerinden 'e-posta' parametresini almak ve bunları dizide saklamak için loop'u kullanabilirsiniz.


1
Bu dizeleri tarayıcı adres çubuğundan almıyorum ama bunun için çözüm yayınladınız
Mohammad

OP JavaScript değil, PHP hakkında soruyordu
Jacob Alvarez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.