اذهب إلى المحتوى

التعامل مع الروابط URL في PHP


سارة محمد2

تحليل رابط

نستخدم الدالة 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&parameter2=bar

تعمل الدالة http_build_query()‎ مع المصفوفات متعددة الأبعاد أيضًا:

$parameters = array(
    "parameter3" => array(
        "sub1" => "foo",
        "sub2" => "bar",
    ),
    "parameter4" => "baz",
);

$queryString = http_build_query($parameters);

تصبح محتويات المتغير ‎$queryString بعد تنفيذ الشيفرة السابقة:

parameter3%5Bsub1%5D=foo&parameter3%5Bsub2%5D=bar&parameter4=baz

والذي هو النسخة المرمزة للرابط:

parameter3[sub1]=foo&parameter3[sub2]=bar&parameter4=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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...