Bagaimana cara menghapus querystring dan hanya mendapatkan url?


201

Saya menggunakan PHP untuk membangun URL halaman saat ini. Terkadang, URL dalam bentuk

www.mydomian.com/myurl.html?unwantedthngs

diminta. Saya ingin menghapus ?dan semua yang mengikutinya (querystring), sehingga URL yang dihasilkan menjadi:

www.mydomain.com/myurl.html

Kode saya saat ini adalah:

<?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, itu disebut "string kueri".
Evan Mulawski

Jawaban:


578

Kamu bisa memakai strtok untuk mendapatkan string sebelum kemunculan pertama?

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

strtok()mewakili teknik yang paling ringkas untuk secara langsung mengekstraksi substring sebelum ?di querystring. explode()kurang langsung karena harus menghasilkan larik dua elemen yang berpotensi yang dengannya elemen pertama harus diakses.

Beberapa teknik lain mungkin rusak ketika querystring hilang atau berpotensi bermutasi substring lain / tidak diinginkan dalam url - teknik ini harus dihindari.

Sebuah demonstrasi :

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

Keluaran:

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
Memberi +1 untuk menggunakan $ _SERVER secara langsung alih-alih membangun kembali url hanya untuk menguraikannya lagi. akan memberi +1 lainnya jika memungkinkan, untuk persetujuan.
ericsoco

8
Ups - membalikkan argumen tersebut untuk meledak (), pembatas berjalan lebih dulu. array_shift(explode('?',$_SERVER["REQUEST_URI"]))
sini

13
Itu tidak mengembalikan bool (false) jika? tidak ada dalam string, ia mengembalikan string.
Ben C

4
Hebat! .. Masih mengembalikan url meskipun ?tidak ada.
Harikrishnan

1
@sepehr, saya hanya tidak melihat titik untuk tidak menggunakan fungsi yang melakukan persis apa yang Anda butuhkan dan menggunakan yang lain dan menguraikan hasilnya (yaitu dapatkan [0] setelah meledak) (kecuali tentu saja ada alasan khusus seperti kinerja yang lebih baik , kurangnya ketergantungan yang tidak dibutuhkan, dll).
RiaD

66

Gunakan Manual PHP - parse_url () untuk mendapatkan bagian yang Anda butuhkan.

Edit (contoh penggunaan untuk @Navi Gamage)

Anda bisa menggunakannya seperti ini:

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

    return $constructed_url;
}

?>

Edit (contoh lengkap kedua):

Fungsi yang diperbarui untuk memastikan skema akan dilampirkan dan tidak ada pesan pemberitahuan yang muncul:

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

Akan kembali:

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
)

Ini adalah output dari melewatkan contoh url melalui parse_url () tanpa parameter kedua (hanya untuk penjelasan).

Dan ini adalah hasil akhir setelah membangun url menggunakan:

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

Keluaran:

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

Saya membacanya .. Saya sedikit bingung karena baru mengenal php. Bisakah Anda membantu saya dengan kode php di atas?
Navi Gamage

saya menambahkan kode ini setelah baris 9 $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?"));
Navi Gamage

Ini menghapus bagian permintaan di url ...> www.mydomain.com/myurl.html?unwantedthings hasilnya Oke! > www.mydomian.com/myurl.html Selesai ... Tetapi ketika datang dengan url normal> www.mydomain.com/myurl.html hasilnya tidak ada apa
Navi Gamage

strrpos () di 'www.mydomain.com/myurl.html' akan mengembalikan 0 (FALSE yang di-cast ke boolean agar lebih benar) sehingga substr Anda akan kosong. Gunakan satu : substr () ATAU parse_url () karena menggunakan keduanya tidak masuk akal;)
veritas

Maksud saya FALSE dilemparkan ke int; D
veritas

54

solusi terbaik:

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

Tidak perlu memasukkan http://domain.com Anda ke dalam jika Anda mengirim formulir ke domain yang sama.


Perhatikan bahwa parse_url mengharapkan URL absolut, sehingga Anda akan mendapatkan hasil yang salah dalam beberapa kasus, misalnya jika REQUEST_URL Anda mulai dengan beberapa garis miring berurutan. Itu akan ditafsirkan sebagai protokol-relatif URI.
NikiC

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

Teman-teman yang memberikan jawaban atas jawaban Anda sudah selesai .. terima kasih atas bantuan Anda .. Ini menghapus bagian permintaan dalam url ...
Navi Gamage

> www.mydomain.com/myurl.html?unwantedthings hasilnya Oke! > www.mydomian.com/myurl.html Selesai ... Tetapi ketika datang dengan url normal> www.mydomain.com/myurl.html hasilnya tidak ada apa
Navi Gamage

Kode php baru code <? 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"]; $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?")); } mengembalikan $ pageURL; }?>code
Navi Gamage

2
Saya pikir ini adalah solusi yang agak manis dan sederhana untuk masalah ini. Tidak perlu banyak perluasan atau fungsi. Saya menggunakan ini untuk mendapatkan nama file yang disebut saat ini. $ base = basename ($ _ SERVER ['REQUEST_URI']); $ page = substr ($ base, 0, strrpos ($ base, "?"));
Rob

Seperti yang dinyatakan oleh Navi, jawaban ini tidak dapat diandalkan. 3v4l.org/nhVii Jika querystring tidak ada di url, seluruh url dihapus! Teknik ini tidak menyadari url-komponen. Jawaban ini tidak disarankan.
mickmackusa

9

Cara termudah

$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

Saya tidak setuju bahwa ini adalah Jalan Paling Mudah. Tidak, teks tebal tidak membuat pernyataan Anda lebih menarik. Jawaban ini kurang penjelasan.
mickmackusa

@mickmackusa Bisakah Anda jelaskan komentar Anda? Di mana saya perlu menjelaskan jawaban saya? Aku akan berterima kasih padamu.
Mukesh Saxena

Semua jawaban pada Stackoverflow harus mencakup penjelasan tentang bagaimana solusi itu bekerja dan mengapa Anda merasa itu adalah teknik yang ideal. Tautan ke dokumentasi juga diterima. Saya sepenuhnya memahami solusi Anda, tetapi peneliti lain mungkin tidak. Jawaban khusus kode adalah nilai rendah di Stackoverflow karena mereka sangat sedikit mendidik / memberdayakan ribuan peneliti masa depan. Tentang tidak menjadi yang paling sederhana - 3v4l.org/RE0GD akan menjadi versi yang lebih sederhana dari jawaban Anda karena memiliki lebih sedikit variabel yang dideklarasikan dan membuat hanya satu pengganti daripada dua. Jawaban yang diterima paling sederhana dari semuanya.
mickmackusa

Perbedaan lainnya adalah bahwa jawaban yang diterima juga menangani kemungkinan fragmen, tetapi jawaban Anda tidak. 3v4l.org/ERr4V atau lebih buruk itu dapat memotong url di sebelah kiri querystring 3v4l.org/L61q1
mickmackusa


4

Anda dapat menggunakan fungsi build parse_url seperti itu:

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

2

Anda dapat mencoba:

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

2

Jika Anda ingin mendapatkan jalur permintaan ( info lebih lanjut ):

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

Jika Anda ingin menghapus kueri dan (dan mungkin juga fragmen):

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

Untuk menghapus string kueri dari URI permintaan, ganti string kueri dengan string kosong:

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

Saya pikir akan ada masalah potensial dengan www.example.com/myurl.html?.
Earlee

1

Karena saya berurusan dengan URL relatif dan absolut, saya memperbarui solusi veritas seperti kode di bawah ini.
Anda dapat mencoba sendiri di sini: 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

bisa juga menggunakan berikut sesuai komentar manual php

$_SERVER['REDIRECT_URL']

Harap dicatat ini hanya berfungsi untuk lingkungan PHP tertentu dan ikuti komentar di bawah dari halaman itu untuk informasi lebih lanjut;

Tujuan: Nama jalur URL dari file PHP saat ini, info jalur adalah N / A dan tidak termasuk string kueri URL. Termasuk garis miring terkemuka.

Peringatan: Ini sebelum URL ditulis ulang (yaitu sesuai dengan URL panggilan asli).

Peringatan: Tidak disetel pada semua lingkungan PHP, dan pasti hanya yang dengan penulisan ulang URL.

Bekerja pada mode web: Ya

Bekerja pada mode CLI: Tidak


0

Coba ini

$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

Dengan asumsi Anda masih ingin mendapatkan URL tanpa argumen permintaan (jika tidak disetel), cukup gunakan pernyataan steno jika untuk memeriksa strpos:

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

0

Ini adalah solusi sederhana jika Anda menggunakan Laravel:

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

-3

Coba ini:

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

atau

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

1
Maaf tetapi ini salah - URI dapat ditulis ulang oleh htaccess - ini akan menghasilkan pengembalian nama skrip tetapi bukan URI saat ini.
Hexodus

Berbahaya karena bisa dipalsukan.
tim

konfirmasi salah. misalkan Anda sedang menulis proxy.php yang merupakan .htaccess dialihkan ke dari permintaan untuk berbagai sumber daya seperti index.php, prices.php, about.php, dan secara dinamis membuat tampilan untuk nama yang diminta. jika Anda menggunakan ini, skrip akan selalu melihat proxy.php daripada sumber daya yang diinginkan yang ingin dibuat.
Dmitry
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.