الفرق بين المراجعتين ل"PHP/preg match all"

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<nowiki><noinclude>{{DISPLAYTITLE:الدالة <code>preg_match_all()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎...')
 
ط
 
سطر 1: سطر 1:
<nowiki><noinclude>{{DISPLAYTITLE:الدالة <code>preg_match_all()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في PHP}}</nowiki><nowiki></noinclude></nowiki>
+
<noinclude>{{DISPLAYTITLE:الدالة <code>preg_match_all()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في PHP}}</noinclude>
 
 
 
(PHP 4, PHP 5, PHP 7)
 
(PHP 4, PHP 5, PHP 7)
  
تطابق الدالة preg_match_all()‎‎ تعبيرًا نمطيًا بشكل شامل.
+
تطابق الدالة <code>preg_match_all()‎‎</code> تعبيرًا نمطيًا بشكل شامل.
 
+
==الوصف==
== الوصف ==
+
<syntaxhighlight lang="php">
 
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
 
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
 
+
</syntaxhighlight>تبحث هذه الدالة في الموضوع <code>subject</code> عن جميع المتطابقات للتعبير النمطي المُعطى <code>pattern</code> وتضعهم في المصفوفة <code>matches</code> بالترتيب المحدد بواسطة <code>flags</code>.
تبحث هذه الدالة في الموضوع subject عن جميع المتطابقات للتعبير النمطي المُعطى pattern وتضعهم في المصفوفة matches بالترتيب المحدد بواسطة flags.
 
  
 
بعد العثور على أول متطابقة، ستستمر عمليات البحث التالية من نهاية المتطابقة الأخيرة.
 
بعد العثور على أول متطابقة، ستستمر عمليات البحث التالية من نهاية المتطابقة الأخيرة.
 
+
==المعاملات==
== المعاملات ==
+
===<code>pattern</code>===
 
 
=== pattern ===
 
 
النمط المراد البحث عنه، كسلسلة نصية.
 
النمط المراد البحث عنه، كسلسلة نصية.
 
+
===<code>subject</code>===
=== subject ===
 
 
السلسلة النصية المُدخلة.
 
السلسلة النصية المُدخلة.
 
+
===<code>matches</code>===
=== matches ===
+
مصفوفة من جميع المتطابقات في مصفوفة متعددة الأبعاد مُرتّبة وفقًا للرايات <code>flags</code>.
مصفوفة من جميع المتطابقات في مصفوفة متعددة الأبعاد مُرتّبة وفقًا للرايات flags.
+
===<code>flags</code>===
 
+
يمكن أن تكون مزيجًا من الرايات التالية (لاحظ أنه من غير المنطقي استخدام <code>PREG_PATTERN_ORDER</code> مع <code>PREG_SET_ORDER</code>).
=== flags ===
+
====<code>PREG_PATTERN_ORDER</code>====
يمكن أن تكون مزيجًا من الرايات التالية (لاحظ أنه من غير المنطقي استخدام PREG_PATTERN_ORDER مع PREG_SET_ORDER).
+
ترتيب النتائج بحيث تكون <code>‎‎‎‎$matches[0</code>]‎ عبارة عن مصفوفة من تطابقات كاملة للنمط، و ‎<code>$matches[1]‎</code> عبارة عن مصفوفة من السلاسل النصية المتطابقة مع النمط الفرعي الأول الموجود بين الأقواس، وهكذا.<syntaxhighlight lang="php">
 
 
==== PREG_PATTERN_ORDER ====
 
ترتيب النتائج بحيث تكون ‎‎‎‎$matches[0]‎ عبارة عن مصفوفة من تطابقات كاملة للنمط، و ‎$matches[1]‎ عبارة عن مصفوفة من السلاسل النصية المتطابقة مع النمط الفرعي الأول الموجود بين الأقواس، وهكذا.
 
 
 
 
<?php
 
<?php
 
 
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
 
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
 
+
   "<b>example: </b><div align=left>this is a test</div>",
   "<nowiki><b>example: </b></nowiki><nowiki><div align=left>this is a test</div></nowiki>",
 
 
 
 
   $out, PREG_PATTERN_ORDER);
 
   $out, PREG_PATTERN_ORDER);
 
 
echo $out[0][0] . ", " . $out[0][1] . "\n";
 
echo $out[0][0] . ", " . $out[0][1] . "\n";
 
 
echo $out[1][0] . ", " . $out[1][1] . "\n";
 
echo $out[1][0] . ", " . $out[1][1] . "\n";
 
 
?>
 
?>
 
+
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
سوف تكون مُخرجات المثال أعلاه كالتالي:
+
<b>example: </b>, <div align=left>this is a test</div>
 
 
<nowiki><b>example: </b></nowiki>, <nowiki><div align=left>this is a test</div></nowiki>
 
 
 
 
example: , this is a test
 
example: , this is a test
 +
</syntaxhighlight>لذا، تحتوي المصفوفة ‎<code>$out[0]</code>‎ على مجموعة من السلاسل النصية التي تتطابق مع النمط الكامل، وتحتوي المصفوفة ‎ ‎<code>$out[1]</code>‎على مجموعة من السلاسل النصية المحاطة بالوسوم.
  
لذا، تحتوي المصفوفة ‎$out[0]‎ على مجموعة من السلاسل النصية التي تتطابق مع النمط الكامل، وتحتوي المصفوفة ‎ ‎$out[1]‎على مجموعة من السلاسل النصية المحاطة بالوسوم.
+
إذا احتوى النمط على نمط فرعي مُسمّى، فستحتوي المصفوفة <code>‎$matches</code> بشكل إضافي على عناصر للمفاتيح مع اسم النمط الفرعي.
 
 
إذا احتوى النمط على نمط فرعي مُسمّى، فستحتوي المصفوفة ‎$match بشكل إضافي على عناصر للمفاتيح مع اسم النمط الفرعي.
 
 
 
إذا كان النمط يحتوي على نمط فرعي مُسمّى مكرر، يُحتفظ بالنمط الفرعي الموجود في أقصى اليمين في ‎$match[NAME]‎.
 
  
 +
إذا كان النمط يحتوي على نمط فرعي مُسمّى مكرر، يُحتفظ بالنمط الفرعي الموجود في أقصى اليمين في ‎<code>$match[NAME]‎</code>.<syntaxhighlight lang="php">
 
<?php
 
<?php
 
 
preg_match_all(
 
preg_match_all(
 
 
   '/(?J)(?<match>foo)|(?<match>bar)/',
 
   '/(?J)(?<match>foo)|(?<match>bar)/',
 
 
   'foo bar',
 
   'foo bar',
 
 
   $matches,
 
   $matches,
 
 
   PREG_PATTERN_ORDER
 
   PREG_PATTERN_ORDER
 
 
);
 
);
 
 
print_r($matches['match']);
 
print_r($matches['match']);
 
 
?>
 
?>
 +
</syntaxhighlight><code>PREG_SET_ORDER</code>
  
سوف تكون مُخرجات المثال أعلاه كالتالي:
+
سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
 
 
 
Array
 
Array
 
 
(
 
(
 
+
   [0] =>
   [0] =>  
 
 
 
 
   [1] => bar
 
   [1] => bar
 
 
)
 
)
 
+
</syntaxhighlight>ترتيب النتائج بحيث تكون <code>‎‎‎‎$matches[0]</code>‎ عبارة عن مصفوفة من أول مجموعة من التطابقات، و ‎‎‎‎<code>$matches[1]‎</code> عبارة عن مصفوفة من ثاني مجموعة من التطابقات، وهكذا.<syntaxhighlight lang="php">
==== PREG_SET_ORDER ====
 
ترتيب النتائج بحيث تكون ‎‎‎‎$matches[0]‎ عبارة عن مصفوفة من أول مجموعة من التطابقات، و ‎‎‎‎$matches[1]‎ عبارة عن مصفوفة من ثاني مجموعة من التطابقات، وهكذا.
 
 
 
 
<?php
 
<?php
 
 
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
 
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
 
+
   "<b>example: </b><div align=\"left\">this is a test</div>",
   "<nowiki><b>example: </b></nowiki><nowiki><div align=\"left\">this is a test</div></nowiki>",
 
 
 
 
   $out, PREG_SET_ORDER);
 
   $out, PREG_SET_ORDER);
 
 
echo $out[0][0] . ", " . $out[0][1] . "\n";
 
echo $out[0][0] . ", " . $out[0][1] . "\n";
 
 
echo $out[1][0] . ", " . $out[1][1] . "\n";
 
echo $out[1][0] . ", " . $out[1][1] . "\n";
 
 
?>
 
?>
 
+
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
سوف تكون مُخرجات المثال أعلاه كالتالي:
+
<b>example: </b>, example:
 
+
<div align="left">this is a test</div>, this is a test
<nowiki><b>example: </b></nowiki>, example:
+
</syntaxhighlight>
 
+
====<code>PREG_OFFSET_CAPTURE</code>====
<nowiki><div align="left">this is a test</div></nowiki>, this is a test
+
إذا مُرِرت هذه الراية، فستُعيد الدالةُ إزاحةَ السلسلة النصية المُذيلة أيضًا لكل تكرار للمتطابقة. لاحظ أن هذا يغير قيمة المصفوفة <code>matches</code> لمصفوفة من المصفوفات إذ يكون كل عنصر عبارة عن مصفوفة تتكون من السلسلة النصية المطابقة عند الفهرس 0 وإزاحة سلسلتها النصية في <code>subject</code> عند الفهرس 1.<syntaxhighlight lang="php">
 
 
==== PREG_OFFSET_CAPTURE ====
 
إذا مُرِرت هذه الراية، فستُعيد الدالةُ إزاحةَ السلسلة النصية المُذيلة أيضًا لكل تكرار للمتطابقة. لاحظ أن هذا يغير قيمة المصفوفة matches لمصفوفة من المصفوفات إذ يكون كل عنصر عبارة عن مصفوفة تتكون من السلسلة النصية المطابقة عند الفهرس 0 وإزاحة سلسلتها النصية في subject عند الفهرس 1.
 
 
 
 
<?php
 
<?php
 
 
preg_match_all('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
 
preg_match_all('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
 
 
print_r($matches);
 
print_r($matches);
 
 
?>
 
?>
 
+
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
سوف تكون مُخرجات المثال أعلاه كالتالي:
 
 
 
 
Array
 
Array
 
 
(
 
(
 +
    [0] => Array
 +
        (
 +
            [0] => Array
 +
                (
 +
                    [0] => foobarbaz
 +
                    [1] => 0
 +
                )
  
   [0] => Array
+
        )
 
 
       (
 
 
 
           [0] => Array
 
  
               (
+
    [1] => Array
 +
        (
 +
            [0] => Array
 +
                (
 +
                    [0] => foo
 +
                    [1] => 0
 +
                )
  
                   [0] => foobarbaz
+
        )
  
                   [1] => 0
+
    [2] => Array
 +
        (
 +
            [0] => Array
 +
                (
 +
                    [0] => bar
 +
                    [1] => 3
 +
                )
  
               )
+
        )
  
       )
+
    [3] => Array
 +
        (
 +
            [0] => Array
 +
                (
 +
                    [0] => baz
 +
                    [1] => 6
 +
                )
  
   [1] => Array
+
        )
 
 
       (
 
 
 
           [0] => Array
 
 
 
               (
 
 
 
                   [0] => foo
 
 
 
                   [1] => 0
 
 
 
               )
 
 
 
       )
 
 
 
   [2] => Array
 
 
 
       (
 
 
 
           [0] => Array
 
 
 
               (
 
 
 
                   [0] => bar
 
 
 
                   [1] => 3
 
 
 
               )
 
 
 
       )
 
 
 
   [3] => Array
 
 
 
       (
 
 
 
           [0] => Array
 
 
 
               (
 
 
 
                   [0] => baz
 
 
 
                   [1] => 6
 
 
 
               )
 
 
 
       )
 
  
 
)
 
)
 +
</syntaxhighlight><code>PREG_UNMATCHED_AS_NULL</code>
  
إذا لم يُحدد راية ترتيب، فستُفترض الراية PREG_PATTERN_ORDER.
+
إذا تم تمرير هذه الراية، تُعيد الأنماط الفرعية غير المطابقة القيمة NULL؛ خلاف ذلك تُعيد سلسلة نصية فارغة.
 
 
=== offset ===
 
يبدأ البحث عادةً من بداية السلسلة النصية subject. يمكن استخدام المعامل الاختياري offset لتحديد المكان البديل الذي تبدأ منه عملية البحث (بالبايت).
 
  
ملاحظة: استخدام offset لا يعادل تمرير substr ($ subject، $offset)‎ إلى الدالة preg_match_all()‎‎ بدلاً من سلسلة الموضوع النصية، لأن النمط pattern يمكن أن يحتوي على تأكيدات مثل ^ ، $ أو ‎?‎<‎‎‎=x)‎). انظر preg_match()‎‎ للحصول على أمثلة.
+
إذا لم يُحدد راية ترتيب، فستُفترض الراية <code>PREG_PATTERN_ORDER</code>.
  
== القيم المعادة ==
+
===<code>offset</code>===
تُعيد الدالة عدد متطابقات النمط الكاملة (التي قد تكون صفرًا)، أو FALSE في حالة حدوث خطأ.
+
يبدأ البحث عادةً من بداية السلسلة النصية الهدف. يمكن استخدام المعامل الاختياري <code>offset</code> لتحديد المكان البديل الذي تبدأ منه عملية البحث (بالبايت).
  
== سجل التغيير ==
+
ملاحظة: استخدام <code>offset</code> لا يعادل تمرير substr ($ subject، $offset)‎ إلى الدالة <code>preg_match_all()</code>‎‎ بدلاً من سلسلة الموضوع النصية، لأن النمط <code>pattern</code> يمكن أن يحتوي على تأكيدات مثل ^ ، $ أو ‎?‎<‎‎‎=x)‎). انظر <code>preg_match()‎‎</code> للحصول على أمثلة.
 +
==القيم المعادة==
 +
تُعيد الدالة عدد متطابقات النمط الكاملة (التي قد تكون صفرًا)، أو <code>FALSE</code> في حالة حدوث خطأ.
 +
==سجل التغيير==
 
{| class="wikitable"
 
{| class="wikitable"
|الإصدار
+
!الإصدار
|الوصف
+
!الوصف
 +
|-
 +
|7.2.0
 +
|دعم <code>PREG_UNMATCHED_AS_NULL</code> للعامل <code>‎$flags</code>
 
|-
 
|-
 
|5.4.0
 
|5.4.0
|أصبح المعامل matches اختياريًا.
+
|أصبح المعامل <code>matches</code> اختياريًا.
 
|-
 
|-
 
|5.3.6
 
|5.3.6
|إعادة FALSE إذا كانت قيمة offset أكبر من طول subject.
+
|إعادة <code>FALSE</code> إذا كانت قيمة <code>offset</code> أكبر من طول <code>subject</code>.
 
|-
 
|-
 
|5.2.2
 
|5.2.2
سطر 216: سطر 144:
 
|}
 
|}
  
== أمثلة ==
+
==أمثلة==
المثال 1: استخراج جميع أرقام الهواتف من بعض النصوص.
+
المثال 1: استخراج جميع أرقام الهواتف من بعض النصوص.<syntaxhighlight lang="php">
 
 
 
<?php
 
<?php
 
+
preg_match_all("/\(? (\d{3})? \)?  (?(1) [\-\s] ) \d{3}-\d{4}/x",
preg_match_all("/\(?  (\d{3})?  \)?  (?(1) [\ - \ s]) \ d {3} - \ d {4} / x " ,
+
                "Call 555-1212 or 1-800-555-1212", $phones);
 
 
               "Call 555-1212 or 1-800-555-1212", $phones);
 
 
 
 
?>
 
?>
 +
</syntaxhighlight>المثال 2: البحث عن وسوم HTML المتوافقة (دقيق)
  
المثال 2: البحث عن وسوم HTML المتوافقة (دقيق)
+
مثال على المرجع الخلفي. وهو يخبر pcre بأنه يجب أن يتطابق مع المجموعة الثانية من الأقواس في التعبير النمطي نفسه، والتي ستكون ([\w]+) في هذه الحالة. الشرطة المائلة العكسية الزائدة مطلوبة لأن السلسلة النصية محاطة بعلامات اقتباس مزدوجة.<syntaxhighlight lang="php">
 
 
مثال على المرجع الخلفي. وهو يخبر pcre بأنه يجب أن يتطابق مع المجموعة الثانية من الأقواس في التعبير النمطي نفسه، والتي ستكون ([\w]+) في هذه الحالة. الشرطة المائلة العكسية الزائدة مطلوبة لأن السلسلة النصية محاطة بعلامات اقتباس مزدوجة.
 
 
 
 
<?php
 
<?php
 
+
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
$html = "<nowiki><b>bold text</b></nowiki><nowiki><a href=howdy.html>click me</a></nowiki>";
 
 
 
 
preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);
 
preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);
 
 
foreach ($matches as $val) {
 
foreach ($matches as $val) {
 
 
   echo "matched: " . $val[0] . "\n";
 
   echo "matched: " . $val[0] . "\n";
 
 
   echo "part 1: " . $val[1] . "\n";
 
   echo "part 1: " . $val[1] . "\n";
 
 
   echo "part 2: " . $val[2] . "\n";
 
   echo "part 2: " . $val[2] . "\n";
 
 
   echo "part 3: " . $val[3] . "\n";
 
   echo "part 3: " . $val[3] . "\n";
 
 
   echo "part 4: " . $val[4] . "\n\n";
 
   echo "part 4: " . $val[4] . "\n\n";
 
 
}
 
}
 
 
?>
 
?>
 
+
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
سوف تكون مُخرجات المثال أعلاه كالتالي:
+
matched: <b>bold text</b>
 
+
part 1: <b>
matched: <nowiki><b>bold text</b></nowiki>
 
 
 
part 1: <nowiki><b></nowiki>
 
 
 
 
part 2: b
 
part 2: b
 
 
part 3: bold text
 
part 3: bold text
 
+
part 4: </b>
part 4: <nowiki></b></nowiki>
 
  
 
matched: <a href=howdy.html>click me</a>
 
matched: <a href=howdy.html>click me</a>
 
 
part 1: <a href=howdy.html>
 
part 1: <a href=howdy.html>
 
 
part 2: a
 
part 2: a
 
 
part 3: click me
 
part 3: click me
 
 
part 4: </a>
 
part 4: </a>
 +
</syntaxhighlight>المثال 3: استخدام النمط الفرعي
  
المثال 3: استخدام النمط الفرعي
+
يعمل هذا مع إصدار PHP 5.2.2 (PCRE 7.0)‎ أيضًا وما يليه، ومع ذلك يوصى باستخدام النمط في المثال للتوافق مع الإصدارات السابقة.<syntaxhighlight lang="php">
 
 
يعمل هذا مع إصدار PHP 5.2.2 (PCRE 7.0)‎ أيضًا وما يليه، ومع ذلك يوصى باستخدام النمط في المثال للتوافق مع الإصدارات السابقة.
 
 
 
 
<?php
 
<?php
 
 
$str = <<<FOO
 
$str = <<<FOO
 
 
a: 1
 
a: 1
 
 
b: 2
 
b: 2
 
 
c: 3
 
c: 3
 
 
FOO;
 
FOO;
 
 
preg_match_all('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
 
preg_match_all('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
 
 
print_r($matches);
 
print_r($matches);
 
 
?>
 
?>
 
+
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
سوف تكون مُخرجات المثال أعلاه كالتالي:
 
 
 
 
Array
 
Array
 
 
(
 
(
 +
    [0] => Array
 +
        (
 +
            [0] => a: 1
 +
            [1] => b: 2
 +
            [2] => c: 3
 +
        )
  
   [0] => Array
+
    [name] => Array
 
+
        (
       (
+
            [0] => a
 
+
            [1] => b
           [0] => a: 1
+
            [2] => c
 
+
        )
           [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
+
    [1] => Array
 +
        (
 +
            [0] => a
 +
            [1] => b
 +
            [2] => c
 +
        )
  
           [2] => 3
+
    [digit] => Array
 +
        (
 +
            [0] => 1
 +
            [1] => 2
 +
            [2] => 3
 +
        )
  
       )
+
    [2] => Array
 
+
        (
   [2] => Array
+
            [0] => 1
 
+
            [1] => 2
       (
+
            [2] => 3
 
+
        )
           [0] => 1
 
 
 
           [1] => 2
 
 
 
           [2] => 3
 
 
 
       )
 
  
 
)
 
)
 
+
</syntaxhighlight>
== انظر أيضًا ==
+
==انظر أيضًا==
* أنماط PCRE.
+
*[[PHP/pcre pattern|أنماط PCRE]].
* الدالة preg_quote()‎‎: اقتباس حروف التعبير النمطي.
+
*الدالة <code>[[PHP/Preg quote|preg_quote()‎‎]]</code>: اقتباس حروف التعبير النمطي.
* الدالة preg_match()‎‎: مطابقة تعبير نمطي.
+
*الدالة <code>[[PHP/preg match|preg_match()‎‎]]</code>: مطابقة تعبير نمطي.
* الدالة preg_replace()‎‎: البحث عن تعبير نمطي واستبداله.
+
*الدالة <code>[[PHP/preg replace|preg_replace()‎‎]]</code>: البحث عن تعبير نمطي واستبداله.
* الدالة preg_split()‎‎: تقسيم سلسلة نصية باستخدام التعبير النمطي.
+
*الدالة <code>[[PHP/preg split|preg_split()‎‎]]</code>: تقسيم سلسلة نصية باستخدام التعبير النمطي.
* الدالة preg_last_error()‎‎: إعادة رمز الخطأ الخاص بتنفيذ آخر PCRE regex.
+
*الدالة <code>[[PHP/preg last error|preg_last_error()‎‎]]</code>: إعادة رمز الخطأ الخاص بتنفيذ آخر PCRE regex.
 
+
==مصادر==
== مصادر ==
+
<span> </span>
* صفحة الدالة preg_match_all‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في توثيق PHP الرسمي.
+
*[http://php.net/manual/en/function.preg-match-all.php صفحة الدالة preg_match_all‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في توثيق PHP الرسمي].
 +
[[تصنيف:PHP]]
 +
[[تصنيف:PHP Function]]
 +
[[تصنيف:PHP PCRE]]
 +
[[تصنيف:PHP Regular Expressions]]

المراجعة الحالية بتاريخ 22:54، 19 أبريل 2018

(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]‎على مجموعة من السلاسل النصية المحاطة بالوسوم.

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

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

<?php
preg_match_all(
   '/(?J)(?<match>foo)|(?<match>bar)/',
   'foo bar',
   $matches,
   PREG_PATTERN_ORDER
);
print_r($matches['match']);
?>

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

Array
(
   [0] =>
   [1] => bar
)

ترتيب النتائج بحيث تكون ‎‎‎‎$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_UNMATCHED_AS_NULL

إذا تم تمرير هذه الراية، تُعيد الأنماط الفرعية غير المطابقة القيمة NULL؛ خلاف ذلك تُعيد سلسلة نصية فارغة.

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

offset

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

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

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

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

سجل التغيير

الإصدار الوصف
7.2.0 دعم PREG_UNMATCHED_AS_NULL للعامل ‎$flags
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
        )

)

انظر أيضًا

مصادر