تحليل رابط
نستخدم الدالة parse_url()
لتقسيم رابط (url) إلى مكوناته الفردية:
$url = 'http://www.example.com/page?foo=1&bar=baz#anchor'; $parts = parse_url($url);
تصبح محتويات المتغير $parts
بعد تنفيذ الشيفرة السابقة:
Array ( [scheme] => http [host] => www.example.com [path] => /page [query] => foo=1&bar=baz [fragment] => anchor )
يمكنك أن ترجع أيضًا مكون واحد من الرابط بشكلٍ انتقائي، فمثلًا لترجع سلسلة الاستعلام (query string) فقط:
$url = 'http://www.example.com/page?foo=1&bar=baz#anchor'; $queryString = parse_url($url, PHP_URL_QUERY);
يعدّ أيّ من الثوابت التالية مقبولًا:
- PHP_URL_SCHEME
- PHP_URL_HOST
- PHP_URL_PORT
- PHP_URL_USER
- PHP_URL_PASS
- PHP_URL_PATH
- PHP_URL_QUERY
- PHP_URL_FRAGMENT
يمكنك استخدام الدالة parse_str()
لتحليل سلسلة الاستعلام إلى أزواج مفتاح/قيمة:
$params = []; parse_str($queryString, $params);
تصبح محتويات المتغير $params
بعد تنفيذ الشيفرة السابقة:
Array ( [foo] => 1 [bar] => baz )
بناء سلسلة استعلام للرابط من مصفوفة
تنشأ الدالة http_build_query()
سلسلة استعلام من مصفوفة أو كائن، يمكن أن تُضاف هذه السلسلة إلى رابط ما لإنشاء طلب من النوع GET
أو تُستخدم في طلب POST
مع مكتبة cURL
مثلًا:
$parameters = array( 'parameter1' => 'foo', 'parameter2' => 'bar', ); $queryString = http_build_query($parameters);
تصبح محتويات المتغير $queryString
بعد تنفيذ الشيفرة السابقة:
parameter1=foo¶meter2=bar
تعمل الدالة http_build_query()
مع المصفوفات متعددة الأبعاد أيضًا:
$parameters = array( "parameter3" => array( "sub1" => "foo", "sub2" => "bar", ), "parameter4" => "baz", ); $queryString = http_build_query($parameters);
تصبح محتويات المتغير $queryString
بعد تنفيذ الشيفرة السابقة:
parameter3%5Bsub1%5D=foo¶meter3%5Bsub2%5D=bar¶meter4=baz
والذي هو النسخة المرمزة للرابط:
parameter3[sub1]=foo¶meter3[sub2]=bar¶meter4=baz
إعادة التوجيه إلى رابط آخر
يمكنك استخدام الدالة header()
لتوجيه المتصفح ليعيد التوجيه إلى رابط مختلف:
$url = 'https://example.org/foo/bar'; // فحص الترويسات - لايمكنك إرسال ترويسات إذا أُرسلت بالفعل if (!headers_sent()) { header('Location: ' . $url); // الحماية من تنفيذ الشيفرة بعد إعادة توجيه الطلب exit; } else { throw new Exception('Cannot redirect, headers already sent'); }
يمكنك أيضًا إعادة التوجيه إلى رابط نسبي (هذا ليس جزء من توصيف HTTP الرسمي، لكنه يعمل مع جميع المتصفحات):
$url = 'foo/bar'; if (!headers_sent()) { header('Location: ' . $url); exit; } else { throw new Exception('Cannot redirect, headers already sent'); }
إذا كانت الترويسات قد أُرسلت، يمكنك إرسال وسم HTML meta refresh
.
يعتمد وسم meta refresh
على معالجة HTML بشكلٍ صحيح عند العميل لكن قد لايتم ذلك وفقًا للمطلوب، بشكلٍ عام يعمل بشكل صحيح فقط مع متصفحات الويب، ويجب أن تنتبه أيضًا أنه إذا كانت الترويسات قد أُرسلت بالفعل فقد تحصل على خطأ وهذا يشغّل استثناءً.
يمكنك أيضًا أن تطبع رابطًا يضغط عليه المستخدم للعملاء الذين يتجاهلون وسم meta refresh
:
$url = 'https://example.org/foo/bar'; if (!headers_sent()) { header('Location: ' . $url); } else { // الحماية من رؤية المتصفح للرابط على أنّه HTML $saveUrl = htmlspecialchars($url); // إخبار المتصفح أن يعيد توجيه الصفحة إلى $saveUrl بعد 0 ثانية print '<meta http-equiv="refresh" content="0; url=' . $saveUrl . '">'; // إظهار الرابط للمستخدم print '<p>Please continue to <a href="' . $saveUrl . '">' . $saveUrl . '</a></p>'; } exit;
كيفية تحليل رابط
عند كتابتك شيفرة بلغة PHP قد تحتاج إلى تقسيم رابط إلى عدة أجزاء، ويوجد عدة طرق لذلك وفقًا لاحتياجاتك، سنشرح هذه الطرق في الفقرة التالية لتختار منها ما يناسبك.
استخدام parse_url()
تحلل الدالة parse_url()
رابطًا وتعيد مصفوفة ترابطية (associative array) تتضمن مكونات الرابط المختلفة.
$url = parse_url('http://example.com/project/controller/action/param1/param2'); /* Array ( [scheme] => http [host] => example.com [path] => /project/controller/action/param1/param2 ) */
يمكنك استخدام الدالة explode إذا كنت تحتاج أن يكون path
مقسّمًا:
$url = parse_url('http://example.com/project/controller/action/param1/param2'); $url['sections'] = explode('/', $url['path']); /* Array ( [scheme] => http [host] => example.com [path] => /project/controller/action/param1/param2 [sections] => Array ( [0] => [1] => project [2] => controller [3] => action [4] => param1 [5] => param2 ) ) */
يمكنك استخدام الدالة end() إذا كنت تحتاج الجزء الأخير من sections
:
$last = end($url['sections']);
إذا كان الرابط يحتوي على متغيرات GET
يمكنك استعادتها أيضًا:
$url = parse_url('http://example.com?var1=value1&var2=value2'); /* Array ( [scheme] => http [host] => example.com [query] => var1=value1&var2=value2 ) */
إذا أردت تقسيم متغيرات الاستعلام يمكنك استخدام parse_str()
كما يلي:
$url = parse_url('http://example.com?var1=value1&var2=value2'); parse_str($url['query'], $parts); /* Array ( [var1] => value1 [var2] => value2 ) */
استخدام explode()
تعيد الدالة explode
مصفوفة من السلاسل النصية، كل منها سلسلة جزئية من سلسلة نصية مُشكَّلة من تقسيمها على الحدود التي يشكّلها حد السلسلة النصية.
$url = "http://example.com/project/controller/action/param1/param2"; $parts = explode('/', $url); /* Array ( [0] => http: [1] => [2] => example.com [3] => project [4] => controller [5] => action [6] => param1 [7] => param2 ) */
يمكنك استعادة الجزء الأخير من الرابط كالتالي:
$last = end($parts); // param2
يمكنك أيضًا التنقل في المصفوفة باستخدام sizeof()
مع عامل رياضي كما في الشيفرة التالية:
echo $parts[sizeof($parts)-2]; // param1
استخدام basename()
تُعطى الدالة basename()
سلسلة نصية تتضمن مسارًا إلى ملف أو مجلد وترجع مكوّن الاسم الزائد أي ترجع الجزء الأخير من الرابط فقط.
$url = "http://example.com/project/controller/action/param1/param2"; $parts = basename($url); // param2
إذا كان الرابط يحتوي على المزيد من الأشياء وكل ما تحتاجه هو اسم المجلد الذي يتضمن الملف الذي تستخدمه عندها يمكنك استخدام dirname()
:
$url = "http://example.com/project/controller/action/param1/param2/index.php"; $parts = basename(dirname($url)); // param2
ترجمة -وبتصرف- للفصول [URLs - How to break down an URL] من كتاب PHP Notes for Professionals book
اقرأ أيضًا
- المقال التالي: معالجة بيانات طلبيات HTTP والتعامل مع أخطاء رفع الملفات في PHP
- المقال السابق: شرح المولدات وتوضيح مفهوم المغلف (closure) في PHP
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.