क्वेरिस्ट्रिंग कैसे निकालें और केवल यूआरएल प्राप्त करें?


201

वर्तमान पृष्ठ का URL बनाने के लिए PHP का उपयोग कर Im। कभी-कभी, के रूप में यूआरएल

www.mydomian.com/myurl.html?unwantedthngs

अनुरोध किया जाता है। मैं ?और इसके बाद आने वाली हर चीज़ को हटाना चाहता हूं (जैसे कि), जिसके परिणामस्वरूप URL बन जाता है:

www.mydomain.com/myurl.html

मेरा वर्तमान कोड यह है:

<?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, जिसे "क्वेरी स्ट्रिंग" कहा जाता है।
इवान मुलवस्की

जवाबों:


577

strtokपहली बार होने से पहले आप स्ट्रिंग प्राप्त करने के लिए उपयोग कर सकते हैं?

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

strtok()?क्वेरिस्ट्रिंग में सीधे सबस्ट्रिंग निकालने से पहले सबसे संक्षिप्त तकनीक का प्रतिनिधित्व करता है । explode()कम प्रत्यक्ष है क्योंकि यह एक संभावित दो-तत्व सरणी का उत्पादन करना चाहिए जिसके द्वारा पहले तत्व को एक्सेस किया जाना चाहिए।

कुछ अन्य तकनीकें तब टूट सकती हैं जब क्वेरिस्ट्रिंग गायब हो या संभावित रूप से url में अन्य / अनजाने सब्सट्रेटिंग को म्यूट करें - इन तकनीकों से बचा जाना चाहिए।

एक प्रदर्शन :

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

आउटपुट:

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
+1 का उपयोग करने के बजाय सीधे $ _SERVER का उपयोग करने के लिए केवल url को फिर से पार्स करने के लिए। यदि संभव हो, तो एक और +1 देना होगा।
एरिकोस्को

8
उफ़ - विस्फोट के लिए उन तर्कों को उल्टा (), सीमांकक पहले जाता है। array_shift(explode('?',$_SERVER["REQUEST_URI"]))
यहाँ

13
यह बूल (झूठा) वापस नहीं करता है अगर? स्ट्रिंग में मौजूद नहीं है, यह स्ट्रिंग लौटाता है।
बेन सी।

4
महान! .. यह अभी भी ?मौजूद नहीं है, भले ही url वापस कर रहा है ।
हरिकृष्णन

1
@sepehr, मैं अभी किसी भी बिंदु को फ़ंक्शन का उपयोग नहीं करने के लिए नहीं देखता हूं जो वास्तव में आपको ज़रूरत है और एक और एक का उपयोग करता है और इसे परिणामित करता है (यानी विस्फोट के बाद [0] मिलता है) (जब तक कि निश्चित रूप से बेहतर प्रदर्शन जैसे कोई विशिष्ट कारण नहीं है , अनावश्यक निर्भरता की कमी, आदि)।
रियाद

66

PHP मैनुअल का उपयोग करें - parse_url () भागों आप की जरूरत प्राप्त करने के लिए।

संपादित करें (उदाहरण @Navi गेम के लिए उपयोग)

आप इसे इस तरह से उपयोग कर सकते हैं:

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

    return $constructed_url;
}

?>

संपादित करें (दूसरा पूर्ण उदाहरण):

सुनिश्चित करने के लिए अपडेट किया गया फ़ंक्शन संलग्न किया जाएगा और कोई भी नोटिस संदेश नहीं आएगा:

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

वापस होगा:

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
)

यह पारस_उर्ल () के माध्यम से उत्तीर्ण उदाहरण से आउटपुट है जिसमें कोई दूसरा पैरामीटर नहीं है (केवल स्पष्टीकरण के लिए)।

और url का उपयोग करने के बाद यह अंतिम आउटपुट है:

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

आउटपुट:

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

मैं इसे पढ़ता हूं..मैं थोड़ा उलझन में अगर नए php के लिए। क्या आप मुझे ऊपर php कोड के साथ मदद कर सकते हैं?
नवी गमेज

मैंने इस कोड को लाइन 9 $ पेजुरल = रूट ($ पेजुरल, 0, स्ट्र्रैप्स ($ पेजएलएल, ";")) के बाद जोड़ा;
नवी गमेज

यह url में क्वेरी क्वेरी अनुभाग ...> www.mydomain.com/myurl.html?unwantedthings परिणाम ठीक है! > www.mydomian.com/myurl.html किया ... लेकिन जब यह सामान्य यूआरएल के साथ आता है> www.mydomain.com/myurl.html परिणाम कुछ भी नहीं है .. खाली
नवी Gamage

'www.mydomain.com/myurl.html' में strrpos () 0 वापस आ जाएगा (FALSE बूलियन को अधिक सही होने के लिए डाला गया ) इसलिए आपका रूट खाली होगा। एक का उपयोग करें : पदार्थ () या parse_url () क्योंकि दोनों का उपयोग करने का कोई मतलब नहीं है;)
veritas

मेरा मतलब था कि FALSE ने इंट को कास्ट किया; डी
वेरिटास

54

सबसे अच्छा उपाय:

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

यदि आप एक ही डोमेन के लिए एक फॉर्म जमा कर रहे हैं तो आपको अपने http://domain.com को इसमें शामिल करने की आवश्यकता नहीं है ।


ध्यान दें कि parse_url एक पूर्ण URL की अपेक्षा करता है, इसलिए आपको कुछ मामलों में गलत परिणाम मिलेंगे, जैसे कि आपका REQUEST_URL कई लगातार स्लैश के साथ शुरू होता है। जिन्हें प्रोटोकॉल-सापेक्ष यूआरआई के रूप में व्याख्यायित किया जाएगा।
निक्की

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

दोस्तों आपके उत्तर के लिए cording Im किया गया है..आपकी मदद के लिए धन्यवाद। यह url में क्लैस क्वेरी सेक्शन है ...
Navi Gamage

> www.mydomain.com/myurl.html?unwantedthings परिणाम ठीक है! > www.mydomian.com/myurl.html किया ... लेकिन जब यह सामान्य url के साथ आता है तो> www.mydomain.com/myurl.html परिणाम कुछ भी नहीं है .. खाली
नवी Gamage

नया php कोड code <? Php फ़ंक्शन curPageURL () {$ pageURL = 'http'; if ($ _SERVER ["HTTPS"] == "पर") {$ pageURL। = "s";} $ pageURL। = "": // "; if ($ _SERVER ["SERVER_PORT"]! = "80") {$ pageURL। = $ _SERVER ["SERVER_NAME"]। ":"। $ _ SERVER ["SERVER_PORT"]। $ _ SERVER ["REQUEST_URI"]]; } और {$ pageURL। = $ _SERVER ["SERVER_NAME"]। $ _ SERVER ["REQUEST_URI"]; $ पेजुरल = पदार्थ ($ पेजुरल, 0, स्ट्रैप्स ($ पेजुरल, ";")); } $ पेजुरल वापस; }?>code
नवी Gamage

2
मुझे लगता है कि यह समस्या का एक मीठा और सरल समाधान है। सीमाओं या कार्यों के भार की कोई आवश्यकता नहीं है। मैंने इसका उपयोग वर्तमान नाम फ़ाइल नाम प्राप्त करने के लिए किया है। $ आधार = बेसन ($ _ SERVER ['REQUEST_URI']); $ पृष्ठ = पदार्थ ($ आधार, 0, स्ट्रैप्स ($ आधार, ";"));
रोब

जैसा कि नवी द्वारा कहा गया है, यह उत्तर विश्वसनीय नहीं है। 3v4l.org/nhVii यदि querystring url में अनुपस्थित है, तो पूरा url हटा दिया जाता है! यह तकनीक url- घटक-जागरूक नहीं है। यह उत्तर असावधान है।
मिकमैकुसा

9

सबसे आसान तरीका है

$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

मैं असहमत हूं कि यह मोस्ट इजीएस्ट वे है। नहीं, बोल्ड टेक्स्ट आपके कथन को अधिक सम्मोहक नहीं बनाता है। इस उत्तर में स्पष्टीकरण का अभाव है।
मिकमैकुसा

@mickmackusa आप अपनी टिप्पणी विस्तृत कर सकते हैं? मुझे अपना उत्तर समझाने की आवश्यकता कहाँ है? मैं आपका आभारी रहूंगा।
मुकेश सक्सेना

Stackoverflow पर सभी उत्तरों में एक स्पष्टीकरण शामिल होना चाहिए कि समाधान कैसे काम करता है और आपको क्यों लगता है कि यह एक आदर्श तकनीक है। प्रलेखन के लिंक भी स्वागत योग्य हैं। मैं पूरी तरह से आपके समाधान को समझता हूं, लेकिन अन्य शोधकर्ता नहीं कर सकते। कोड-ओनली उत्तर स्टैकओवरफ़्लो पर कम मूल्य हैं क्योंकि वे हजारों भविष्य के शोधकर्ताओं को शिक्षित / सशक्त बनाने के लिए बहुत कम करते हैं। सबसे सरल नहीं होने के बारे में - 3v4l.org/RE0GD आपके उत्तर का एक सरल संस्करण होगा क्योंकि इसमें कम घोषित चर हैं और दो के बजाय केवल एक प्रतिस्थापन करता है। स्वीकृत उत्तर सभी से सरल है।
मिकमैकुसा

एक और अंतर यह है कि स्वीकृत उत्तर एक संभावित टुकड़े का भी ध्यान रखता है, लेकिन आपका नहीं होगा। 3v4l.org/ERr4V या इससे भी बदतर यह url को बायीं ओर झुका सकता है 3v4l.org/L61q1
mickmackusa

7

आपको इस समाधान को लागू करने के लिए कम से कम PHP संस्करण 5.4 की आवश्यकता होगी, एक लाइन पर एक चर में विस्फोट किए बिना और अगले पर समवर्ती करना, लेकिन एक आसान लाइनर होगा:

$_SERVER["HTTP_HOST"].explode('?', $_SERVER["REQUEST_URI"], 2)[0];

सर्वर चर: http://php.net/manual/en/reserved.variables.server.php
ऐरे डेरेफेरिंग: https://wiki.php.net/rfc/functionarraydereferencing



2

तुम कोशिश कर सकते हो:

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

2

यदि आप अनुरोध पथ ( अधिक जानकारी ) प्राप्त करना चाहते हैं :

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

यदि आप क्वेरी हटाना चाहते हैं (और शायद टुकड़ा भी):

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

अनुरोध URI से क्वेरी स्ट्रिंग को निकालने के लिए, क्वेरी स्ट्रिंग को रिक्त स्ट्रिंग से बदलें:

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

मुझे लगता है कि इसके साथ एक संभावित समस्या होगी www.example.com/myurl.html?
अर्ली

1

क्योंकि मैं सापेक्ष और निरपेक्ष दोनों URL से निपटता हूं, इसलिए मैंने नीचे दिए गए कोड की तरह veritas के समाधान को अपडेट किया।
आप खुद यहां कोशिश कर सकते हैं: 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

php मैनुअल टिप्पणी के अनुसार निम्नलिखित का उपयोग भी कर सकता है

$_SERVER['REDIRECT_URL']

कृपया ध्यान दें कि यह केवल कुछ निश्चित PHP वातावरण के लिए ही काम कर रहा है और अधिक जानकारी के लिए उस पेज से bellow टिप्पणी का पालन करें;

उद्देश्य: वर्तमान PHP फ़ाइल का URL पथ नाम, पथ-जानकारी N / A है और URL क्वेरी स्ट्रिंग को छोड़कर। जिसमें प्रमुख स्लैश शामिल हैं।

कैविएट: यह URL रीराइट होने से पहले है (यानी यह मूल कॉल URL के अनुसार है)।

कैविएट: सभी PHP वातावरणों पर सेट नहीं किया गया है, और निश्चित रूप से केवल URL रीराइट वाले हैं।

वेब मोड पर काम करता है: हाँ

सीएलआई मोड पर काम करता है: नहीं


0

इसे इस्तेमाल करे

$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 को बिना क्वेरी वाले (यदि वे सेट नहीं किए गए हैं) प्राप्त करना चाहते हैं, तो केवल शॉर्टहैंड का उपयोग करें यदि स्टेटमेंट को जांचने के लिए strpos:

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

0

यदि आप Laravel का उपयोग कर रहे हैं, तो यहां एक सरल उपाय है:

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

-3

इसे इस्तेमाल करे:

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

या

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

1
क्षमा करें, लेकिन यह गलत है - URI को htaccess द्वारा फिर से लिखा जा सकता है - इसके परिणामस्वरूप स्क्रिप्ट नाम वापस आ जाएगा, लेकिन वर्तमान URI नहीं।
हेक्सोडस

खतरनाक के रूप में यह खराब हो सकता है।
तैमूर

पुष्टि गलत है। मान लें कि आप प्रॉक्सी.php लिख रहे हैं। जो विभिन्न संसाधनों जैसे कि index.php, price.php, about.php जैसे अनुरोधों से रीडायरेक्ट करता है, और गतिशील रूप से अनुरोधित नाम के लिए एक दृश्य बनाता है। यदि आप इसका उपयोग करते हैं, तो स्क्रिप्ट हमेशा वांछित अनुरोधित संसाधन के बजाय प्रॉक्सी को देखना होगा।
दिमित्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.