الفرق بين المراجعتين لصفحة: «PHP/preg match»

من موسوعة حسوب
< PHP
أنشأ الصفحة ب'<nowiki><noinclude>{{DISPLAYTITLE:الدالة <code>preg_match()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎...'
 
طلا ملخص تعديل
سطر 1: سطر 1:
<nowiki><noinclude>{{DISPLAYTITLE:الدالة <code>preg_match()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في PHP}}</nowiki><nowiki></noinclude></nowiki>
<noinclude>{{DISPLAYTITLE:الدالة <code>preg_match()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎</code>‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في PHP}}</noinclude>
 
(PHP 4, PHP 5, PHP 7)
(PHP 4, PHP 5, PHP 7)


سطر 59: سطر 58:
</syntaxhighlight>
</syntaxhighlight>
; <code>PREG_UNMATCHED_AS_NULL</code>
; <code>PREG_UNMATCHED_AS_NULL</code>
: If this flag is passed, unmatched subpatterns are reported as <code>NULL</code>; otherwise they are reported as an empty string.
; إذا مُرِرت هذه الراية ، تُعاد الأنماط الفرعية غير المطابقة بالقيمة <code>NULL</code>؛ وتُعاد بخلاف ذلك كسلسلة فارغة.
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
سطر 130: سطر 129:
== سجل التغييرات ==
== سجل التغييرات ==
{| class="wikitable"
{| class="wikitable"
|الإصدار
!الإصدار
|الوصف
!الوصف
|-
|-
|7.2.0
|7.2.0
سطر 182: سطر 181:
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
domain name is: php.net
domain name is: php.net
</syntaxhighlight>المثال 4: استخدام الأنماط الفرعية
</syntaxhighlight>المثال 4: استخدام الأنماط الفرعية<syntaxhighlight lang="php">
 
<?php
<?php
$str = 'foobar: 2008';
$str = 'foobar: 2008';
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
/ * يعمل هذا مع إصدار 5.2.2 أيضًا وما يليه، ومع ذلك
/ * يعمل هذا مع إصدار 5.2.2 أيضًا وما يليه، ومع ذلك
 
* يوصى باستخدام النموذج أعلاه للتوافق مع الإصدارات السابقة * /
<nowiki>*</nowiki> يوصى باستخدام النموذج أعلاه للتوافق مع الإصدارات السابقة * /
 
// preg_match ('/ (؟<name>\w+): (?<digit>\d+)/', $str, $matches);
// preg_match ('/ (؟<name>\w+): (?<digit>\d+)/', $str, $matches);
print_r($matches);
print_r($matches);
?>
?>
 
</syntaxhighlight>سوف تكون مُخرجات المثال أعلاه كالتالي:<syntaxhighlight lang="php">
سوف تكون مُخرجات المثال أعلاه كالتالي:
 
Array
Array
(
(
 
    [0] => foobar: 2008
   [0] => foobar: 2008
    [name] => foobar
 
    [1] => foobar
   [name] => foobar
    [digit] => 2008
 
    [2] => 2008
   [1] => foobar
 
   [digit] => 2008
 
   [2] => 2008
 
)
)
</syntaxhighlight>


== ملاحظات ==
== ملاحظات ==
نصيحة: لا تستخدم الدالة preg_match()‎‎ إذا كنت تريد فقط التحقق من وجود سلسلة نصية واحدة في سلسلة نصية أخرى. سيكون من الأسرع استخدام الدالة strpos()‎‎ بدلاً من ذلك.
نصيحة: لا تستخدم الدالة <code>preg_match()‎‎</code> إذا كنت تريد فقط التحقق من وجود سلسلة نصية واحدة في سلسلة نصية أخرى. سيكون من الأسرع استخدام الدالة <code>[[PHP/strpos|strpos()‎‎]]</code> بدلاً من ذلك.


== انظر أيضًا ==
== انظر أيضًا ==
* أنماط PCRE.
* [[PHP/pcre pattern|أنماط PCRE]].
* الدالة preg_quote()‎‎: اقتباس حروف التعبير النمطية.
* الدالة <code>[[PHP/preg quote|preg_quote()‎‎]]</code>: اقتباس حروف التعبير النمطية.
* الدالة preg_match_all()‎‎: إجراء مطابقة شاملة لتعبير نمطي.
* الدالة <code>[[PHP/preg match all|preg_match_all()‎‎]]</code>: إجراء مطابقة شاملة لتعبير نمطي.
* الدالة preg_replace()‎‎: البحث عن تعبير نمطي واستبداله.
* الدالة <code>[[PHP/preg replace|preg_replace()‎‎]]</code>: البحث عن تعبير نمطي واستبداله.
* الدالة preg_split()‎‎: تقسيم سلسلة نصية باستخدام التعبير النمطي.
* الدالة <code>[[PHP/preg split|preg_split()‎‎]]</code>: تقسيم سلسلة نصية باستخدام التعبير النمطي.
* الدالة preg_last_error()‎‎: إعادة رمز الخطأ الخاص بتنفيذ آخر تعبير نمطي بصيغة PCRE.
* الدالة <code>[[PHP/preg last error|preg_last_error()‎‎]]</code>: إعادة رمز الخطأ الخاص بتنفيذ آخر تعبير نمطي بصيغة PCRE.


== مصادر ==
== مصادر ==
* صفحة الدالة preg_match‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في توثيق PHP الرسمي.
* [http://php.net/manual/en/function.preg-match.php صفحة الدالة preg_match‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في توثيق PHP الرسمي].
[[تصنيف:PHP]]
[[تصنيف:PHP Function]]
[[تصنيف:PHP PCRE]]
[[تصنيف:PHP Regular Expressions]]

مراجعة 13:23، 21 أبريل 2018

(PHP 4, PHP 5, PHP 7)

تُطابق الدالة preg_match()‎‎ تعبيرًا نمطيًا على سلسلة نصية.

الوصف

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

تبحث الدالة في السلسلة النصية subject عن مُطابقة للتعبير النمطي الُمعطى pattern.

المعاملات

pattern

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

subject

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

matches

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

flags

يمكن أن تكون قيمة المعامل flags أحد الرايات التالية:

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

<?php
preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

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

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

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

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

    [3] => Array
        (
            [0] => baz
            [1] => 6
        )

)
PREG_UNMATCHED_AS_NULL
إذا مُرِرت هذه الراية ، تُعاد الأنماط الفرعية غير المطابقة بالقيمة NULL؛ وتُعاد بخلاف ذلك كسلسلة فارغة.
<?php
preg_match('/(a)(b)*(c)/', 'ac', $matches);
var_dump($matches);
preg_match('/(a)(b)*(c)/', 'ac', $matches, PREG_UNMATCHED_AS_NULL);
var_dump($matches);
?>

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

array(4) {
  [0]=>
  string(2) "ac"
  [1]=>
  string(1) "a"
  [2]=>
  string(0) ""
  [3]=>
  string(1) "c"
}
array(4) {
  [0]=>
  string(2) "ac"
  [1]=>
  string(1) "a"
  [2]=>
  NULL
  [3]=>
  string(1) "c"
}

offset

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

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

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>

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

Array
(
)

وبين المثال الآتي:

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

الذي سوف ينتج:

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

)

بدلاً من ذلك، لتجنب استخدام substr()‎‎، استخدم G\ بدلاً من الرمز ^ ، أو المُعدِّل A بدلاً من ذلك، فكلاهما يعمل مع معامل الإزاحة offset.

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

تُعيد الدالة preg_match()‎‎ القيمة 1 إذا تطابق النمط pattern مع السلسلة النصية subject المُعطاة، أو 0 إذا لم يتطابق، أو FALSE في حالة حدوث خطأ.

تحذير: قد تُعيد هذه الدالة القيمة المنطقية FALSE، ولكن قد تُعيد أيضًا قيمة غير منطقية تُقيّم بنفس القيمة FALSE. يرجى قراءة قسم القيم المنطقية Booleans لمزيد من المعلومات. ويستخدم العامل === لاختبار القيمة المعادة من هذه الدالة.

سجل التغييرات

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

أمثلة

المثال 1: إيجاد سلسلة النصية "php"

يشير الحرف "i" بعد محدد النمط إلى بحث غير حساس لحالة الأحرف:

<?php
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
?>

المثال 2: البحث عن الكلمة "web" يشير الرمز ‎\b الموجود في النمط إلى حدود الكلمات، لذا لا يمكن مطابقة سوى كلمة "web" المنفصلة، وليس جزء من كلمة مثل "webbing" أو "cobweb":

<?php
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
?>

المثال 3: الحصول على اسم النطاق من عنوان URL

<?php
// استخراج اسم المضيف من URL
preg_match('@^(?:http://)?([^/]+)@i',
   "http://www.php.net/index.html", $matches);
$host = $matches[1];
// استخراج آخر قسمين من اسم المضيف
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

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

domain name is: php.net

المثال 4: استخدام الأنماط الفرعية

<?php
$str = 'foobar: 2008';
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
/ * يعمل هذا مع إصدار 5.2.2 أيضًا وما يليه، ومع ذلك
* يوصى باستخدام النموذج أعلاه للتوافق مع الإصدارات السابقة * /
// preg_match ('/ (؟<name>\w+): (?<digit>\d+)/', $str, $matches);
print_r($matches);
?>

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

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

ملاحظات

نصيحة: لا تستخدم الدالة preg_match()‎‎ إذا كنت تريد فقط التحقق من وجود سلسلة نصية واحدة في سلسلة نصية أخرى. سيكون من الأسرع استخدام الدالة strpos()‎‎ بدلاً من ذلك.

انظر أيضًا

مصادر