PHP/preg match all

من موسوعة حسوب
< PHP
مراجعة 14:07، 19 أبريل 2018 بواسطة Khaled-yassin (نقاش | مساهمات) (أنشأ الصفحة ب'<nowiki><noinclude>{{DISPLAYTITLE:الدالة <code>preg_match_all()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

<noinclude>{{DISPLAYTITLE:الدالة <code>preg_match_all()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في PHP}}</noinclude>

(PHP 4, PHP 5, PHP 7)

تطابق الدالة preg_match_all()‎‎ تعبيرًا نمطيًا بشكل شامل.

الوصف

int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

تبحث هذه الدالة في الموضوع subject عن جميع المتطابقات للتعبير النمطي المُعطى pattern وتضعهم في المصفوفة matches بالترتيب المحدد بواسطة flags.

بعد العثور على أول متطابقة، ستستمر عمليات البحث التالية من نهاية المتطابقة الأخيرة.

المعاملات

pattern

النمط المراد البحث عنه، كسلسلة نصية.

subject

السلسلة النصية المُدخلة.

matches

مصفوفة من جميع المتطابقات في مصفوفة متعددة الأبعاد مُرتّبة وفقًا للرايات flags.

flags

يمكن أن تكون مزيجًا من الرايات التالية (لاحظ أنه من غير المنطقي استخدام PREG_PATTERN_ORDER مع PREG_SET_ORDER).

PREG_PATTERN_ORDER

ترتيب النتائج بحيث تكون ‎‎‎‎$matches[0]‎ عبارة عن مصفوفة من تطابقات كاملة للنمط، و ‎$matches[1]‎ عبارة عن مصفوفة من السلاسل النصية المتطابقة مع النمط الفرعي الأول الموجود بين الأقواس، وهكذا.

<?php

preg_match_all("|<[^>]+>(.*)</[^>]+>|U",

   "<b>example: </b><div align=left>this is a test</div>",

   $out, PREG_PATTERN_ORDER);

echo $out[0][0] . ", " . $out[0][1] . "\n";

echo $out[1][0] . ", " . $out[1][1] . "\n";

?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

<b>example: </b>, <div align=left>this is a test</div>

example: , this is a test

لذا، تحتوي المصفوفة ‎$out[0]‎ على مجموعة من السلاسل النصية التي تتطابق مع النمط الكامل، وتحتوي المصفوفة ‎ ‎$out[1]‎على مجموعة من السلاسل النصية المحاطة بالوسوم.

إذا احتوى النمط على نمط فرعي مُسمّى، فستحتوي المصفوفة ‎$match بشكل إضافي على عناصر للمفاتيح مع اسم النمط الفرعي.

إذا كان النمط يحتوي على نمط فرعي مُسمّى مكرر، يُحتفظ بالنمط الفرعي الموجود في أقصى اليمين في ‎$match[NAME]‎.

<?php

preg_match_all(

   '/(?J)(?<match>foo)|(?<match>bar)/',

   'foo bar',

   $matches,

   PREG_PATTERN_ORDER

);

print_r($matches['match']);

?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

Array

(

   [0] =>

   [1] => bar

)

PREG_SET_ORDER

ترتيب النتائج بحيث تكون ‎‎‎‎$matches[0]‎ عبارة عن مصفوفة من أول مجموعة من التطابقات، و ‎‎‎‎$matches[1]‎ عبارة عن مصفوفة من ثاني مجموعة من التطابقات، وهكذا.

<?php

preg_match_all("|<[^>]+>(.*)</[^>]+>|U",

   "<b>example: </b><div align=\"left\">this is a test</div>",

   $out, PREG_SET_ORDER);

echo $out[0][0] . ", " . $out[0][1] . "\n";

echo $out[1][0] . ", " . $out[1][1] . "\n";

?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

<b>example: </b>, example:

<div align="left">this is a test</div>, this is a test

PREG_OFFSET_CAPTURE

إذا مُرِرت هذه الراية، فستُعيد الدالةُ إزاحةَ السلسلة النصية المُذيلة أيضًا لكل تكرار للمتطابقة. لاحظ أن هذا يغير قيمة المصفوفة matches لمصفوفة من المصفوفات إذ يكون كل عنصر عبارة عن مصفوفة تتكون من السلسلة النصية المطابقة عند الفهرس 0 وإزاحة سلسلتها النصية في subject عند الفهرس 1.

<?php

preg_match_all('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);

print_r($matches);

?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

Array

(

   [0] => Array

       (

           [0] => Array

               (

                   [0] => foobarbaz

                   [1] => 0

               )

       )

   [1] => Array

       (

           [0] => Array

               (

                   [0] => foo

                   [1] => 0

               )

       )

   [2] => Array

       (

           [0] => Array

               (

                   [0] => bar

                   [1] => 3

               )

       )

   [3] => Array

       (

           [0] => Array

               (

                   [0] => baz

                   [1] => 6

               )

       )

)

إذا لم يُحدد راية ترتيب، فستُفترض الراية PREG_PATTERN_ORDER.

offset

يبدأ البحث عادةً من بداية السلسلة النصية subject. يمكن استخدام المعامل الاختياري offset لتحديد المكان البديل الذي تبدأ منه عملية البحث (بالبايت).

ملاحظة: استخدام offset لا يعادل تمرير substr ($ subject، $offset)‎ إلى الدالة preg_match_all()‎‎ بدلاً من سلسلة الموضوع النصية، لأن النمط pattern يمكن أن يحتوي على تأكيدات مثل ^ ، $ أو ‎?‎<‎‎‎=x)‎). انظر preg_match()‎‎ للحصول على أمثلة.

القيم المعادة

تُعيد الدالة عدد متطابقات النمط الكاملة (التي قد تكون صفرًا)، أو FALSE في حالة حدوث خطأ.

سجل التغيير

الإصدار الوصف
5.4.0 أصبح المعامل matches اختياريًا.
5.3.6 إعادة FALSE إذا كانت قيمة offset أكبر من طول subject.
5.2.2 قبول الأنماط الفرعية المسماة للصياغة (<name>?) و ('name'?) وكذلك (P?‎<name>‎). وكانت الإصدارات السابقة تقبل (P?‎<name>‎) فقط.

أمثلة

المثال 1: استخراج جميع أرقام الهواتف من بعض النصوص.

<?php

preg_match_all("/\(?  (\d{3})?  \)? (?(1) [\ - \ s]) \ d {3} - \ d {4} / x " ,

               "Call 555-1212 or 1-800-555-1212", $phones);

?>

المثال 2: البحث عن وسوم HTML المتوافقة (دقيق)

مثال على المرجع الخلفي. وهو يخبر pcre بأنه يجب أن يتطابق مع المجموعة الثانية من الأقواس في التعبير النمطي نفسه، والتي ستكون ([\w]+) في هذه الحالة. الشرطة المائلة العكسية الزائدة مطلوبة لأن السلسلة النصية محاطة بعلامات اقتباس مزدوجة.

<?php

$html = "<b>bold text</b><a href=howdy.html>click me</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {

   echo "matched: " . $val[0] . "\n";

   echo "part 1: " . $val[1] . "\n";

   echo "part 2: " . $val[2] . "\n";

   echo "part 3: " . $val[3] . "\n";

   echo "part 4: " . $val[4] . "\n\n";

}

?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

matched: <b>bold text</b>

part 1: <b>

part 2: b

part 3: bold text

part 4: </b>

matched: <a href=howdy.html>click me</a>

part 1: <a href=howdy.html>

part 2: a

part 3: click me

part 4: </a>

المثال 3: استخدام النمط الفرعي

يعمل هذا مع إصدار PHP 5.2.2 (PCRE 7.0)‎ أيضًا وما يليه، ومع ذلك يوصى باستخدام النمط في المثال للتوافق مع الإصدارات السابقة.

<?php

$str = <<<FOO

a: 1

b: 2

c: 3

FOO;

preg_match_all('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

print_r($matches);

?>

سوف تكون مُخرجات المثال أعلاه كالتالي:

Array

(

   [0] => Array

       (

           [0] => a: 1

           [1] => b: 2

           [2] => c: 3

       )

   [name] => Array

       (

           [0] => a

           [1] => b

           [2] => c

       )

   [1] => Array

       (

           [0] => a

           [1] => b

           [2] => c

       )

   [digit] => Array

       (

           [0] => 1

           [1] => 2

           [2] => 3

       )

   [2] => Array

       (

           [0] => 1

           [1] => 2

           [2] => 3

       )

)

انظر أيضًا

  • أنماط PCRE.
  • الدالة preg_quote()‎‎: اقتباس حروف التعبير النمطي.
  • الدالة preg_match()‎‎: مطابقة تعبير نمطي.
  • الدالة preg_replace()‎‎: البحث عن تعبير نمطي واستبداله.
  • الدالة preg_split()‎‎: تقسيم سلسلة نصية باستخدام التعبير النمطي.
  • الدالة preg_last_error()‎‎: إعادة رمز الخطأ الخاص بتنفيذ آخر PCRE regex.

مصادر

  • صفحة الدالة preg_match_all‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في توثيق PHP الرسمي.