কীভাবে ক্যোরিস্ট্রিংটি সরিয়ে কেবল ইউআরএল পাবেন?


201

আমি বর্তমান পৃষ্ঠার ইউআরএল তৈরি করতে পিএইচপি ব্যবহার করছি। কখনও কখনও, আকারে ইউআরএল

www.mydomian.com/myurl.html?unwantedthngs

অনুরোধ করা হয় আমি ?এটি অনুসরণ করে এবং এটি (ক্যোয়ার্স স্ট্রিং) সমস্ত কিছু মুছে ফেলতে চাই , ফলে ফলাফলটি ইউআরএল হয়ে যায়:

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
বিটিডাব্লু, এটিকে "ক্যোরি স্ট্রিং" বলা হয়
ইভান মুলাওস্কি

উত্তর:


577

আপনি strtokপ্রথম ঘটনার আগে স্ট্রিং পেতে ব্যবহার করতে পারেন?

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

strtok()ক্যোরিস্ট্রিংয়ের আগে সরাসরি ?স্ট্রিংগুলি বের করার জন্য সর্বাধিক সংক্ষিপ্ত কৌশলটি উপস্থাপন করে । explode()কম সরাসরি কারণ এটি অবশ্যই একটি সম্ভাব্য দ্বি-উপাদান অ্যারে তৈরি করতে পারে যার মাধ্যমে প্রথম উপাদানটি অ্যাক্সেস করতে হবে।

যখন ইউআরএলটিতে ক্যোরিস্ট্রিং অনুপস্থিত বা সম্ভাব্যভাবে অন্যান্য / অযৌক্তিক সাবস্ট্রিংগুলি পরিবর্তন করতে পারে তখন কিছু অন্যান্য কৌশল ভঙ্গ হতে পারে - এই কৌশলগুলি এড়ানো উচিত।

একটি বিক্ষোভ :

$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
ইউআরএলটিকে পুনরায় বিল্ড করার পরিবর্তে সরাসরি p _SERVER ব্যবহার করার জন্য +1 it সংক্ষিপ্ততার জন্য, সম্ভব হলে আরও একটি +1 দেবে।
এরিকোসো

8
ওফস - বিস্ফোরণ () এর জন্য সেই যুক্তিগুলি বিপরীত করুন, ডিলিমিটারটি প্রথমে যায়। array_shift(explode('?',$_SERVER["REQUEST_URI"]))
এখানে

13
এটি bool (মিথ্যা) ফিরে না যদি? স্ট্রিং উপস্থিত নেই, এটি স্ট্রিং প্রদান করে।
বেন সি

4
দুর্দান্ত! .. এটি ?উপস্থিত না থাকলেও এটি ইউআরএল ফিরিয়ে দিচ্ছে ।
হরিকৃষ্ণান

1
@ সেফহর, আমি ঠিক তেমন কোনও বিন্দু দেখতে পাচ্ছি না যা ফাংশনটি ব্যবহার করবে যা আপনার প্রয়োজন মতো করে এবং অন্যটি ব্যবহার করে এবং এর ফলাফলটি বিশ্লেষণ করে (যেমন বিস্ফোরণের পরে [0] পান) তবে অবশ্যই আরও ভাল পারফরম্যান্সের মতো নির্দিষ্ট কারণ না থাকলে , অপ্রয়োজনীয় নির্ভরতার অভাব ইত্যাদি)।
রিয়াদ

66

আপনার প্রয়োজনীয় অংশগুলি পেতে পিএইচপি ম্যানুয়াল - parse_url () ব্যবহার করুন ।

সম্পাদনা করুন (@ নাভি গ্যামেজের উদাহরণস্বরূপ ব্যবহার)

আপনি এটি এর মতো ব্যবহার করতে পারেন:

<?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
)

এটি কোনও দ্বিতীয় প্যারামিটার ছাড়াই পার্সে_আরল () এর মাধ্যমে ইউআরএলগুলি পাস করার আউটপুট only

এবং এটি ব্যবহার করে ইউআরএল নির্মাণের পরে চূড়ান্ত আউটপুট:

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

আমি এটি পড়েছি ... পিএইচপি তে নতুন যদি আমি কিছুটা বিভ্রান্ত হয় তবে আপনি কি আমাকে উপরের পিএইচপি কোড দিয়ে সহায়তা করতে পারেন?
নাভি গ্যামেজ

আমি এই কোডটি 9 line পেজ URL = সাবস্ট্রাস্ট ($ পেজ URL, 0, স্ট্রাপপস ($ পেজ URL, "?")) এর পরে যুক্ত করেছি;
নাভি গামেজে

এটি ইউআরএল ...> www.mydomain.com/myurl.html?unwantedthings ফলাফলের ক্যোয়ারী বিভাগটি সাফ করে দেয়! > www.mydomian.com/myurl.html সম্পন্ন ... তবে যখন এটি সাধারণ ইউআরএল আসে> www.mydomain.com/myurl.html ফলাফল কিছুই হয় না..এম্পটি
নাভি

'www.mydomain.com/myurl.html' তে strrpos () ফিরে আসবে 0 (FALSE বুলিয়ানকে আরও সঠিক হতে দেবে) সুতরাং আপনার সাবস্ট্রিটি খালি থাকবে। ব্যবহার করুন এক substr (): বা ); parse_url () কারণ তাদের উভয়ই ব্যবহার কোন জ্ঞান করে তোলে
Veritas

আমি বলতে চাইছি মিথ্যা কাস্ট করা; ডি
ভেরিটাস

54

সব থেকে ভালো সমাধান:

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

আপনি যদি একই ডোমেইনে কোনও ফর্ম জমা দিচ্ছেন তবে আপনার http://domain.com কে অন্তর্ভুক্ত করার দরকার নেই ।


নোট করুন যে parse_url একটি নিখুঁত URL প্রত্যাশা করে, তাই আপনি কিছু ক্ষেত্রে ভুল ফলাফল পাবেন, উদাহরণস্বরূপ যদি আপনার REQUEST_URL একাধিক পরপর স্ল্যাশ দিয়ে শুরু হয়। এগুলি একটি প্রোটোকল-সম্পর্কিত ইউআরআই হিসাবে ব্যাখ্যা করা হবে।
NikiC

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

ছেলেরা আপনার উত্তরগুলির সাথে মিল রেখে আমি করলাম..আপনার সাহায্যের জন্য ধন্যবাদ..এটি ইউআরএলের ক্লিয়ার ক্যোয়ারী বিভাগে ...
নাভি

> www.mydomain.com/myurl.html?unwantedthings ফলাফল ঠিক আছে! > www.mydomian.com/myurl.html সম্পন্ন ... তবে যখন এটি সাধারণ ইউআরএল আসে> www.mydomain.com/myurl.html ফলাফল কিছুই হয় না..এম্পটি
নাভি

নতুন পিএইচপি কোড code <? পিএইচপি ফাংশন কার্পেজ URL () {URL পেজ URL = 'http'; যদি ($ _SERVER ["HTTPS"] == "চালু") {$ পেজ URL। = "এস"; $ $ পেজ URL। = ": //"; যদি ($ _SERVER ["SERVER_PORT"]! = "80") URL URL পেজ URL। = $ _SERVER ["SERVER_NAME"]। } অন্য {URL পেজ URL। = $ _SERVER ["SERVER_NAME"] $ _ সার্ভার ["REQUEST_URI"]; $ পেজ URL = সাবস্ট্রিট ($ পেজ URL, 0, স্ট্রপপস ($ পেজ URL, "?")); } রিটার্ন $ পেজ URL; }?>code
নাভি গামেজে

2
আমি মনে করি এটি সমস্যার পরিবর্তে একটি মিষ্টি এবং সহজ সমাধান। বোঝা বা ফাংশন লোড করার প্রয়োজন নেই। বর্তমান নামক ফাইলটির নাম পেতে আমি এটি ব্যবহার করেছি। $ বেস = বেস নাম (S _ সার্ভার ['REQUEST_URI']); $ পৃষ্ঠা = সাবস্ট্রিট ($ বেস, 0, স্ট্রপপস ($ বেস, "?"));
রব

নাভি যেমন বলেছেন, এই উত্তরটি নির্ভরযোগ্য নয় reliable 3v4l.org/nhVii যদি ক্যোরিস্ট্রিং ইউআরএলে অনুপস্থিত থাকে তবে পুরো ইউআরএল সরিয়ে দেওয়া হয়! এই কৌশলটি 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

আমি একমত নই যে এটি সবচেয়ে সহজতম উপায়। না, গা bold় পাঠ্য আপনার বক্তব্যটিকে আরও জোর করে তোলে না। এই উত্তরের একটি ব্যাখ্যা নেই।
মিকম্যাকুসা

@ মিকম্যাকুসা আপনি আপনার মন্তব্যটি বিস্তারিতভাবে বর্ণনা করতে পারেন? আমার উত্তরটি আমার কোথায় ব্যাখ্যা করতে হবে? আমি আপনাকে কৃতজ্ঞ করব।
মুকেশ সাক্সেনা

স্ট্যাকওভারফ্লোতে সমস্ত উত্তরের সমাধানটি কীভাবে কাজ করে এবং আপনি এটি কেন একটি আদর্শ কৌশল বলে মনে করেন তার একটি ব্যাখ্যা অন্তর্ভুক্ত করা উচিত। ডকুমেন্টেশনের লিঙ্কগুলিও স্বাগত। আমি আপনার সমাধানটি পুরোপুরি বুঝতে পেরেছি, তবে অন্য গবেষক তা নাও বুঝতে পারেন। কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে স্বল্প মূল্য কারণ তারা হাজার হাজার ভবিষ্যত গবেষককে শিক্ষিত / ক্ষমতাবান করতে খুব কম কাজ করে। সহজ না হওয়ার বিষয়ে - 3v4l.org/RE0GD আপনার উত্তরের একটি সহজ সংস্করণ হবে কারণ এতে কম ঘোষিত ভেরিয়েবল রয়েছে এবং এটি দুটির পরিবর্তে কেবল একটি প্রতিস্থাপন করে। গৃহীত উত্তরটি সবচেয়ে সহজ।
মিকম্যাকুসা

আর একটি পার্থক্য হ'ল গৃহীত উত্তরটিও একটি সম্ভাব্য খণ্ডের যত্ন নেয়, তবে আপনার তা হবে না। 3v4l.org/ERr4V বা এর থেকেও খারাপ এটি কোয়েস্ট্রিস্টিংয়ের বাম দিকে url ম্যাগ করতে পারে 3v4l.org/L61q1
মিকম্যাকুসা

7

এই সমাধানটি এক লাইনে ভেরিয়েবলের মধ্যে বিস্ফোরিত না হয়ে এবং পরের দিকে কনক্যাটেন্ট না করে কমপক্ষে আপনার পিএইচপি সংস্করণ 5.4 প্রয়োজন হবে তবে একটি সহজ লাইনারটি হ'ল:

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

সার্ভারের ভেরিয়েবলগুলি: http://php.net/manual/en/reided.variables.server.php
অ্যারে ডিरेফারেন্সিং: https://wiki.php.net/rfc/functionarraydereferences



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

অনুরোধ ইউআরআই থেকে ক্যোরিয় স্ট্রিংটি সরিয়ে ফেলতে, খালি স্ট্রিংয়ের সাথে ক্যোরির স্ট্রিংটি প্রতিস্থাপন করুন:

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

যেহেতু আমি উভয় আপেক্ষিক এবং নিখুঁত ইউআরএল নিয়ে কাজ করি, তাই আমি নীচের কোডের মতো ভেরিটাসের সমাধান আপডেট করেছি।
আপনি এখানে নিজেকে চেষ্টা করতে পারেন: 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

পিএইচপি ম্যানুয়াল মন্তব্য অনুসারে নিম্নলিখিত ব্যবহার করতে পারে

$_SERVER['REDIRECT_URL']

দয়া করে নোট করুন যে এটি কেবলমাত্র নির্দিষ্ট পিএইচপি পরিবেশের জন্য কাজ করছে এবং আরও তথ্যের জন্য এই পৃষ্ঠাটি থেকে নীচের মন্তব্যটি অনুসরণ করুন;

উদ্দেশ্য: বর্তমান পিএইচপি ফাইলের ইউআরএল পাথের নাম, পাথ-ইনফর্মটি এন / এ এবং ইউআরএল কোয়েরি স্ট্রিং ব্যতীত। শীর্ষস্থানীয় স্ল্যাশ অন্তর্ভুক্ত।

ক্যাভেট: এটি ইউআরএল পুনর্লিখনের আগে (যেমন এটি মূল কল ইউআরএল অনুযায়ী)।

কেভেট: সমস্ত পিএইচপি পরিবেশে সেট করা নেই এবং অবশ্যই ইউআরএল পুনর্লিখনযুক্ত ones

ওয়েব মোডে কাজ করে: হ্যাঁ

সিএলআই মোডে কাজ করে: না


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

আপনি যদি লারাভেল ব্যবহার করছেন তবে এখানে একটি সহজ সমাধান রয়েছে:

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

-3

এটা চেষ্টা কর:

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

অথবা

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

1
দুঃখিত তবে এটি ভুল - ইউআরআই htaccess দ্বারা আবার লেখা যেতে পারে - এর ফলে স্ক্রিপ্টটির নামটি বর্তমান ইউআরআই না দিয়ে ফিরে আসবে।
হেক্সডাস

বিপজ্জনক হিসাবে এটি স্পোফ করা যেতে পারে।
টিম

নিশ্চিত করা ভুল। মনে করুন আপনি প্রক্সি.এফপি লিখছেন যা .htaccess ইন্ডেক্স.এফপি, প্রাইস.এফপি, অ্যাপার্টমেন্ট.পিএফ এর মতো বিভিন্ন সংস্থার অনুরোধগুলি থেকে পুনর্নির্দেশ করে এবং অনুরোধকৃত নামের জন্য গতিশীলভাবে একটি ভিউ তৈরি করে। আপনি যদি এটি ব্যবহার করেন তবে স্ক্রিপ্টটি সর্বদা প্রক্সি.ফ্যাপ দেখতে পাবে যা এটি তৈরি করতে চায় এমন কাঙ্ক্ষিত অনুরোধ করা উত্সের চেয়ে।
দিমিত্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.