Querystring nasıl kaldırılır ve sadece url nasıl alınır?


201

Im geçerli sayfanın URL'sini oluşturmak için PHP kullanarak. Bazen,

www.mydomian.com/myurl.html?unwantedthngs

Talep edilir. Kaldırmak istiyorum? ve her şey onu izleyen (querystring), böylece ortaya çıkan URL olur:

www.mydomain.com/myurl.html

Geçerli kodum şudur:

<?php
function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" .
            $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
?>

8
BTW, buna "sorgu dizesi" denir.
Evan Mulawski

Yanıtlar:


578

strtokDizisinin ilk oluşumundan önce dize almak için kullanabilirsiniz?

$url = strtok($_SERVER["REQUEST_URI"], '?');

strtok()alt dizeyi ?sorgu dizgisinden önce doğrudan ayıklamak için en özlü tekniği temsil eder . explode()ilk öğeye erişilmesi gereken potansiyel olarak iki öğeli bir dizi üretmesi gerektiğinden daha az doğrudandır.

Sorgu dizesi eksik olduğunda veya url'deki diğer / istenmeyen alt dizeleri potansiyel olarak mutasyona uğratırsa diğer bazı teknikler kırılabilir - bu tekniklerden kaçınılmalıdır.

Bir gösteri :

$urls = [
    'www.example.com/myurl.html?unwantedthngs#hastag',
    'www.example.com/myurl.html'
];

foreach ($urls as $url) {
    var_export(['strtok: ', strtok($url, '?')]);
    echo "\n";
    var_export(['strstr/true: ', strstr($url, '?', true)]); // not reliable
    echo "\n";
    var_export(['explode/2: ', explode('?', $url, 2)[0]]);  // limit allows func to stop searching after first encounter
    echo "\n";
    var_export(['substr/strrpos: ', substr($url, 0, strrpos( $url, "?"))]);  // not reliable; still not with strpos()
    echo "\n---\n";
}

Çıktı:

array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => 'www.example.com/myurl.html',
)
---
array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => false,                       // bad news
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => '',                          // bad news
)
---

24
URL'yi yalnızca yeniden ayrıştırmak üzere yeniden oluşturmak yerine $ _SERVER öğesini doğrudan kullanmak için +1. kısaca, mümkünse bir +1 daha verirdi.
ericsoco

8
Hata! Explode () için bu argümanları tersine çevirin, ayırıcı önce gelir. array_shift(explode('?',$_SERVER["REQUEST_URI"]))
burada

13
Bool (false) döndürmezse? dizede yoksa dizeyi döndürür.
Ben C

4
Harika! .. ?Mevcut olmasa bile hala URL döndürüyor .
Harikrishnan

1
@sepehr, sadece tam olarak ihtiyacınız olanı yapan ve başka bir tane kullanan ve sonuçları ayrıştıran (yani patladıktan sonra [0] olsun) işlevi kullanmamanın herhangi bir anlamı görmüyorum (tabii ki daha iyi performans gibi belirli bir neden olmadığı sürece) , gereksiz bağımlılık eksikliği, vb.).
RiaD

66

Kullanım PHP Manual - parse_url () ihtiyacınız parçaları almak için.

Düzenle (@Navi Gamage için örnek kullanım)

Bu şekilde kullanabilirsiniz:

<?php
function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];

    return $constructed_url;
}

?>

Düzenle (ikinci tam örnek):

Düzenin ekleneceğinden ve hiçbir uyarı mesajı görünmediğinden emin olmak için işlev güncellendi:

function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . (isset($url_parts['path'])?$url_parts['path']:'');

    return $constructed_url;
}


$test = array(
    'http://www.mydomian.com/myurl.html?unwan=abc',
    'http://www.mydomian.com/myurl.html',
    'http://www.mydomian.com',
    'https://mydomian.com/myurl.html?unwan=abc&ab=1'
);

foreach($test as $url){
    print_r(parse_url($url));
}       

Dönecek:

Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
    [query] => unwan=abc
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
)
Array
(
    [path] => mydomian.com/myurl.html
    [query] => unwan=abc&ab=1
)

Bu, ikinci parametre olmadan örnek url'lerin parse_url () 'den geçirilmesinden elde edilen çıktıdır (yalnızca açıklama için).

Ve bu url'yi oluşturduktan sonraki son çıktı:

foreach($test as $url){
    echo reconstruct_url($url) . '<br/>';
}   

Çıktı:

http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html

Ben okudum .. Ben php için yeni eğer biraz karışık coz. Yukarıdaki php kodu ile bana yardımcı olabilir misiniz?
Navi Gamage

satır 9 $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?")) sonra bu kodu ekledi;
Navi Gamage

URL'deki sorgu bölümünü temizler ...> www.alanadim.com/alanad.html?unwantedthings sonucu Tamam! > www.mydomian.com/myurl.html Tamamlandı ... Ancak normal url ile birlikte geldiğinde> www.mydomain.com/myurl.html sonuç hiçbir şey değildir.
Boş

'www.mydomain.com/myurl.html' adresindeki strrpos () işlevi 0 değerini döndürür (FALSE, daha doğru olması için boole değerine çevrilir), böylece alt dizeniz boş olur. Birini kullanın : substr () VEYA parse_url () çünkü her ikisini kullanmak mantıklı değildir;)
veritas

Ben FALSE int kastedilen demekti; D
veritas

54

en iyi çözüm:

echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

Aynı alana bir form gönderiyorsanız , http : //etki.com.tr.comunuzu eklemenize gerek yoktur .


Parse_url öğesinin mutlak bir URL beklediğini unutmayın; bu nedenle, örneğin REQUEST_URL dosyanız birden fazla ardışık eğik çizgi ile başlıyorsa, bazı durumlarda yanlış sonuçlar alırsınız. Bunlar protokole bağlı bir URI olarak yorumlanacaktır.
NikiC

16
$val = substr( $url, 0, strrpos( $url, "?"));

Cevaplar cording Guys Im done .. yardımınız için teşekkürler ... url sorgu bölümünü temizler ...
Navi Gamage

> www.mydomain.com/myurl.html?unwantedthings sonuç Tamam! > www.mydomian.com/myurl.html Tamamlandı ... Ancak normal url ile geldiğinde> www.mydomain.com/myurl.html sonuç hiçbir şey değildir.
Boş

Yeni php kodu code <? Php işlevi curPageURL () {$ pageURL = 'http'; if ($ _SERVER ["HTTPS"] == "on") {$ pageURL. = "s";} $ pageURL. = ": //"; eğer ($ _SERVER ["SERVER_PORT"]! = "80") {$ pageURL. = $ _SERVER ["SERVER_NAME"]. ":". $ _ SERVER ["SERVER_PORT"]. $ _ SERVER ["REQUEST_URI"]; } else {$ pageURL. = $ _SERVER ["SERVER_NAME"]. $ _ SERVER ["REQUEST_URI"]; $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?")); } return $ pageURL; }?>code
Navi Gamage

2
Bence bu sorun için oldukça tatlı ve basit bir çözüm. Çok fazla uzanım veya fonksiyona gerek yok. Bunu, şu anki dosya adını almak için kullandım. $ base = taban adı ($ _ SERVER ['REQUEST_URI']); $ page = substr ($ base, 0, strrpos ($ base, "?"));
Rob

Navi tarafından belirtildiği gibi, bu cevap güvenilir değildir. 3v4l.org/nhVii Sorgu dizesi url'de yoksa, URL'nin tamamı kaldırılır! Bu teknik url bileşenine duyarlı değildir. Bu cevap tavsiye edilemez.
mickmackusa

9

En Kolay Yol

$url = 'https://www.youtube.com/embed/ROipDjNYK4k?rel=0&autoplay=1';
$url_arr = parse_url($url);
$query = $url_arr['query'];
print $url = str_replace(array($query,'?'), '', $url);

//output
https://www.youtube.com/embed/ROipDjNYK4k

Bunun en kolay yol olduğuna katılmıyorum. Hayır, kalın metin ifadenizi daha çekici hale getirmez. Bu cevapta bir açıklama yok.
mickmackusa

@mickmackusa Lütfen yorumunuzu biraz açar mısınız? Cevabımı nerede açıklamam gerekir? Sana minnettar olacağım.
Mukesh Saxena

Stackoverflow'daki tüm cevaplar, çözümün nasıl çalıştığına ve neden bunun ideal bir teknik olduğunu düşündüğünüze dair bir açıklama içermelidir. Belgelere bağlantılar da kabul edilir. Çözümünüzü tam olarak anlıyorum, ancak diğer araştırmacılar anlamayabilir. Sadece kod yanıtları Stackoverflow üzerinde düşük değerlidir, çünkü gelecekteki binlerce araştırmacıyı eğitmek / güçlendirmek için çok az şey yaparlar. En basit olmamakla ilgili - 3v4l.org/RE0GD , daha az bildirilen değişkene sahip olduğu ve iki yerine yalnızca bir değiştirme yaptığı için cevabınızın daha basit bir sürümü olacaktır. Kabul edilen cevap en basitidir.
mickmackusa

Başka bir fark, kabul edilen cevabın da olası bir parçayla ilgilenmesidir, ancak sizinki olmayacaktır. 3v4l.org/ERr4V ya da daha kötüsü o querystring sol url bozmak olabilir 3v4l.org/L61q1
mickmackusa


4

Parse_url derlemesini şu şekilde kullanabilirsiniz:

$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

2

Deneyebilirsin:

<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>

2

İstek yolunu almak istiyorsanız ( daha fazla bilgi ):

echo parse_url($_SERVER["REQUEST_URI"])['path']

Sorguyu ve (ve belki de parçayı da) kaldırmak istiyorsanız:

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}
$i = strposa($_SERVER["REQUEST_URI"], ['#', '?']);
echo strrpos($_SERVER["REQUEST_URI"], 0, $i);

1

Sorgu dizesini istek URI'sından kaldırmak için, sorgu dizesini boş bir dizeyle değiştirin:

function request_uri_without_query() {
    $result = $_SERVER['REQUEST_URI'];
    $query = $_SERVER['QUERY_STRING'];
    if(!empty($query)) {
        $result = str_replace('?' . $query, '', $result);
    }
    return $result;
}

Bence potansiyel bir sorun olacak www.example.com/myurl.html?.
Earlee

1

Hem göreli hem de mutlak URL'lerle uğraştığım için, veritas'ın çözümünü aşağıdaki kod gibi güncelledim.
Kendinizi burada deneyebilirsiniz: https://ideone.com/PvpZ4J

function removeQueryStringFromUrl($url) {
    if (substr($url,0,4) == "http") {
        $urlPartsArray = parse_url($url);
        $outputUrl = $urlPartsArray['scheme'] . '://' . $urlPartsArray['host'] . ( isset($urlPartsArray['path']) ? $urlPartsArray['path'] : '' );
    } else {
        $URLexploded = explode("?", $url, 2);
        $outputUrl = $URLexploded[0];
    }
    return $outputUrl;
}

1

ayrıca aşağıdaki php manuel yorum başına kullanabilirsiniz

$_SERVER['REDIRECT_URL']

Bunun yalnızca belirli PHP ortamları için çalıştığını lütfen unutmayın ve daha fazla bilgi için bu sayfadaki aşağıdaki yorumu izleyin;

Amaç: Geçerli PHP dosyasının URL yolu adı, path-info N / A ve URL sorgu dizesi hariç. Öncü eğik çizgi içerir.

Uyarı: URL yeniden yazılmadan önce (yani orijinal arama URL'sine göre).

Uyarı: Tüm PHP ortamlarında ayarlanmamıştır ve kesinlikle yalnızca URL yeniden yazma özelliği olan ortamlarda ayarlanmamıştır.

Web modunda çalışır: Evet

CLI modunda çalışır: Hayır


0

Bunu dene

$url_with_querystring = 'www.mydomian.com/myurl.html?unwantedthngs';
$url_data = parse_url($url_with_querystring);
$url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);

0

URL'yi yine de sorgu bağımsız değişkenleri olmadan almak istediğinizi varsayarsak (ayarlanmamışsa), kontrol etmek için sadece bir shorthand if ifadesi kullanın strpos:

$request_uri = strpos( $_SERVER['REQUEST_URI'], '?' ) !== false ? strtok( $_SERVER["REQUEST_URI"], '?' ) : $_SERVER['REQUEST_URI'];

0

Laravel kullanıyorsanız basit bir çözüm:

Str::before($request->getRequestUri(), '?')

-3

Bunu dene:

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']

veya

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']

1
Maalesef bu yanlış - URI htaccess tarafından yeniden yazılabilir - bu komut dosyası adının döndürülmesine neden olur ancak geçerli URI ile sonuçlanmaz.
Hexodus

Kimlik sahtekarlığı nedeniyle tehlikeli.
tim

onaylamak yanlış. index.php, prices.php, about.php gibi çeşitli kaynaklardan gelen isteklere yönlendiren proxy.php yazdığınızı ve istenen ad için dinamik bir görünüm oluşturduğunu varsayalım. bunu kullanırsanız, komut dosyası oluşturmak istediğiniz istenen kaynak yerine her zaman proxy.php dosyasını görür.
Dmitry
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.