فيما يلي مجموعة من رموز الوظائف الشائعة للتعبيرات العادية في PHP لتسهيل تعلم التعبير العادي لـ PHP
preg_grep.
(بي إتش بي 4، بي إتش بي 5)
preg_grep - إرجاع أوصاف خلايا الصفيف المتطابقة مع النمط
array preg_grep ( نمط السلسلة، إدخال المصفوفة [، أعلام int] )
preg_grep () يُرجع مصفوفة تحتوي على الخلايا الموجودة في مصفوفة الإدخال التي تطابق نمط النمط المحدد.
يمكن أن تكون الأعلام هي الأعلام التالية:
PREG_GREP_INVERT
إذا تم تمرير هذه العلامة، فستُرجع الدالة preg_grep() الخلايا الموجودة في مصفوفة الإدخال التي لا تتطابق مع النمط المحدد. هذه العلامة متاحة منذ PHP 4.2.0.
اعتبارًا من PHP 4.0.4، تتم فهرسة النتائج التي يتم إرجاعها بواسطة preg_grep() باستخدام المفاتيح من مصفوفة الإدخال. إذا كنت لا تريد مثل هذه النتائج، استخدم array_values() لإعادة فهرسة النتائج التي تم إرجاعها بواسطة preg_grep().
ما ورد أعلاه هو وصف preg_grep() في الدليل. بادئ ذي بدء، هذه دالة عادية متوافقة مع Perl، لذلك أعتقد أن preg_grep تعني p(perl)reg(regular)_grep. وتتمثل خصائصها في أنه يمكن استخدامها للمصفوفات من خلال توسيعها الخاص المطابقة في المصفوفات متعددة الأبعاد، ويمكنها إرجاع مصفوفة مطابقة أو غير مطابقة من خلال معلمة الأعلام. كفاءتها أسرع بكثير من استخدام بنية foreach(...){if...} (لم يتم التحقق منها)، ويمكنها مطابقة الأنماط المعقدة. إنه ذو فائدة كبيرة في تطبيقات مثل البحث والفرز.
مثال:
<؟
$arr = array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
// إرجاع جميع عناصر المصفوفة التي تحتوي على أرقام الفاصلة العائمة.
$fl_array = preg_grep ("/^(d+)?.d+$/", $arr);
print_r($fl_array);
?>
preg_match
(PHP 3 >= 3.0.9، PHP 4، PHP 5)
preg_match - تعليمات مطابقة التعبير العادي
int preg_match (نمط السلسلة، موضوع السلسلة [، تطابقات المصفوفة [، علامات int]] )
يبحث في سلسلة الموضوع عن المحتوى الذي يطابق التعبير العادي المعطى بواسطة النمط.
إذا تم توفير التطابقات، فسيتم ملؤها بنتائج البحث. سيحتوي $matches[0] على نص يطابق النمط بأكمله، وسيحتوي $matches[1] على نص يطابق أول نمط فرعي تم التقاطه بين قوسين، وهكذا.
يمكن أن تكون العلامات هي العلامات التالية:
PREG_OFFSET_CAPTURE
إذا تم تعيين هذه العلامة، فسيتم أيضًا إرجاع إزاحة السلسلة المرتبطة لكل تكرار للمطابقة. لاحظ أن هذا يغير قيمة المصفوفة التي تم إرجاعها بحيث تكون كل خلية فيها عبارة عن مصفوفة أيضًا، حيث يكون العنصر الأول هو السلسلة المتطابقة والعنصر الثاني هو إزاحته. هذه العلامة متاحة منذ PHP 4.3.0.
المعلمة flags متاحة منذ PHP 4.3.0.
تُرجع الدالة preg_match() عدد مرات مطابقة النمط. إما 0 مرة (لا يوجد تطابق) أو مرة واحدة، نظرًا لأن preg_match() سيتوقف عن البحث بعد المطابقة الأولى. على العكس من ذلك، سيبحث الدالة preg_match_all() حتى نهاية الموضوع. في حالة حدوث خطأ، تُرجع الدالة preg_match() القيمة FALSE.
نصيحة: إذا كنت تريد فقط معرفة ما إذا كانت هناك سلسلة واحدة ضمن سلسلة أخرى، فلا تستخدم preg_match() . يمكنك استخدام strpos() أو strstr() بدلاً من ذلك، وهو أسرع بكثير.
ما ورد أعلاه هو وصف preg_match() في الدليل، وأعتقد أن وظيفة هذه الوظيفة هي أنه يمكن استخدامها للتحقق، أي ما إذا كانت سلسلة معينة تلبي متطلبات معينة. القيد هو أنه كما هو مذكور أعلاه، فإنه إما يطابق 0 مرة أو مرة واحدة. والقيمة المرجعة هي عدد التطابقات. عندما يكون التطابق الكامل مطلوبًا، يمكن استخدام preg_match_all(). ومن الجدير بالذكر أيضًا دور المصفوفة $matches، والتي يمكن استخدامها كقيمة مُرجعة للنمط الذاتي، وهو أمر مفيد في بعض الأحيان.
مثال:
<؟
if (preg_match ("/(bwebb)s(d)/i"، "PHP هي لغة البرمجة النصية للويب 45 واللغة 34 المفضلة.",$match)) {
طباعة "تم العثور على تطابق.";
print_r($match);
} آخر {
طباعة "لم يتم العثور على تطابق.";
}
?>
<?php
// احصل على اسم المضيف من URL
preg_match("/^(http://)?([^/]+)/i"،
" http://www.php.net/index.html ", $matches);
$المضيف = $matches[2];
// احصل على المقطعين التاليين من اسم المضيف
preg_match("/[^./]+.[^./]+$/"، $host, $matches);
echo "اسم المجال هو: {$matches[0]}n";
?>
preg_match_all
(PHP 3 >= 3.0.9، PHP 4، PHP 5)
preg_match_all - إجراء مطابقة التعبير العادي العالمية، وشرح هذه الوظيفة في الدليل واضح جدًا، لذا لن أشرحها أكثر.
يوضح
int preg_match_all (نمط السلسلة، موضوع السلسلة، تطابقات المصفوفة [، علامات int])
عن كل المحتوى في الموضوع الذي يطابق التعبير العادي المعطى بواسطة النمط ويضع النتائج في التطابقات بالترتيب المحدد بواسطة العلامات.
بعد العثور على التطابق الأول، تبدأ عمليات البحث اللاحقة في نهاية التطابق السابق.
يمكن أن تكون العلامات عبارة عن مجموعة من العلامات التالية (لاحظ أنه ليس من المنطقي استخدام PREG_PATTERN_ORDER وPREG_SET_ORDER معًا):
PREG_PATTERN_ORDER
قم بفرز النتائج بحيث يكون $matches[0] عبارة عن مصفوفة من جميع مطابقات الأنماط، و $matches[1] عبارة عن مصفوفة من السلاسل التي يتطابق معها النمط الفرعي في القوس الأول، وهكذا.
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U"، "<b>مثال: </b><div align=left>هذا اختبار</div >"،
$خارج، PREG_PATTERN_ORDER)؛
اطبع $out[0][0].", ".$out[0][1]."n";
اطبع $out[1][0].", ".$out[1][1]."n";
?>
سيخرج هذا المثال:
<b>مثال: </b>، <div align=left>هذا اختبار</div>
مثال: هذا اختبار
لذلك، يحتوي $out[0] على السلسلة المطابقة للنمط بأكمله، ويحتوي $out[1] على السلسلة بين زوج من علامات HTML.
PREG_SET_ORDER
قم بفرز النتائج بحيث يكون $matches[0] هو مصفوفة المجموعة الأولى من المطابقات، و$matches[1] هو مصفوفة المجموعة الثانية من المطابقات، وهكذا.
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U"،
"<b>مثال: </b><div align=left>هذا اختبار</div>"،
$خارج، PREG_SET_ORDER)؛
اطبع $out[0][0].", ".$out[0][1]."n";
اطبع $out[1][0].", ".$out[1][1]."n";
?>
سيخرج هذا المثال:
<b>مثال: </b>، مثال:
<div align=left>هذا اختبار</div>، هذا اختبار
في هذا المثال، $matches[0] هي المجموعة الأولى من النتائج المطابقة، $matches[0][0] تحتوي على النص المطابق للنمط بأكمله، $matches[0][1] تحتوي على النص المطابق للنمط الفرعي الأول ، وتنتهي بـ وهكذا. وبالمثل، $matches[1] هي المجموعة الثانية من التطابقات، وهكذا.
PREG_OFFSET_CAPTURE
إذا تم تعيين هذه العلامة، فسيتم أيضًا إرجاع إزاحة السلسلة المرتبطة لكل تكرار للمطابقة. لاحظ أن هذا يغير قيمة المصفوفة التي تم إرجاعها بحيث تكون كل خلية هي أيضًا مصفوفة، حيث يكون العنصر الأول هو السلسلة المتطابقة والعنصر الثاني هو إزاحته داخل الموضوع. هذه العلامة متاحة منذ PHP 4.3.0.
إذا لم يتم إعطاء أي علامة، فسيتم افتراض PREG_PATTERN_ORDER.
لعرض عدد المرات التي تمت فيها مطابقة النمط بأكمله (ربما صفر)، أو FALSE في حالة الخطأ.
مثال 1. احصل على جميع أرقام الهواتف من رسالة نصية
<?php
preg_match_all ("/(? (d{3})? )? (?(1) [-s] ) d{3}-d{4}/x"،
"اتصل بالرقم 1212-555 أو 1212-555-800-1"، هواتف $)؛
?>
مثال 2. البحث عن علامات HTML المطابقة (الجشع)
<?php
// \2 مثال على مرجع عكسي، معناه في PCRE هو
// يجب أن يطابق المحتوى الموجود ضمن المجموعة الثانية من الأقواس في التعبير العادي نفسه، في هذه الحالة
// هذا ([w]+). نظرًا لأن السلسلة موجودة بين علامتي اقتباس مزدوجتين، فأنت بحاجة إلى ذلك
// أضف شرطة مائلة عكسية إضافية.
$html = "<b>نص غامق</b><a href=howdy.html>انقر فوقي</a>";
preg_match_all ("/(<([w]+)[^>]*>)(.*)(</\2>)/"، $html, $matches);
لـ ($i=0; $i< count($matches[0]); $i++) {
echo "matched: ".$matches[0][$i]."n";
echo "part 1: ".$matches[1][$i]."n";
echo "part 2: ".$matches[3][$i]."n";
echo "part 3: ".$matches[4][$i]."nn";
}
?>
preg_quote
(PHP 3 >= 3.0.9، PHP 4، PHP 5)
preg_quote - الهروب من وصف أحرف التعبير العادي
السلسلة preg_quote ( string str [, string delimiter] )
preg_quote() str كمعلمة وتضيف شرطة مائلة عكسية أمام كل حرف ينتمي إلى صيغة التعبير العادي. إذا كنت بحاجة إلى مطابقة سلسلة تم إنشاؤها ديناميكيًا كنمط، فيمكنك استخدام هذه الوظيفة للهروب من الأحرف الخاصة التي قد تحتوي عليها.
إذا تم توفير محدد الوسيطة الاختيارية، فسيتم أيضًا تجاوز هذا الحرف. يمكن استخدامه للهروب من المحدد الذي تتطلبه وظيفة PCRE المحدد الأكثر استخدامًا هو الشرطة المائلة /.
تتضمن الأحرف الخاصة للتعبيرات العادية ما يلي: + * ? [ ^ ] $ ( ) { } = !
ملاحظة: هذه الوظيفة آمنة للاستخدام على الكائنات الثنائية.
ما ورد أعلاه هو الشرح الموجود في الدليل، وهو واضح جدًا، لذلك لن أخوض في التفاصيل، بالإضافة إلى ذلك، هناك ملاحظة في الدليل مفادها أنه يمكن استخدام هذه الوظيفة بأمان للكائنات الثنائية، وهو أمر مفيد للغاية.
مثال: مثال 1.preg_quote() example
<?php
الكلمات الرئيسية $ = '40 دولارًا مقابل g3/400'؛
$keywords = preg_quote($keywords, '/');
echo $keywords; // يُرجع $40 لـ g3/400
?>
مثال 2. أضف خطًا مائلًا إلى كلمة في النص
<?php
// في هذا المثال، يتم استخدام preg_quote($word) لإبقاء العلامة النجمية خارج التعبير العادي
// له معنى خاص.
$textbody = "من الصعب جدًا العثور على هذا الكتاب.";
$word = "*جداً*";
$textbody = preg_replace ("/".preg_quote($word)."/"،
"<i>".$word."</i>"،
$textbody);
?>
الخطوة التالية هي تطبيق وظيفة preg_replace التي تتميز بالمرونة الفائقة والقوة الفائقة والمستخدمة على نطاق واسع جدًا.
preg_replace
(PHP 3 >= 3.0.9، PHP 4، PHP 5)
preg_replace – ينفذ تعليمات البحث عن التعبير العادي واستبداله
مختلط preg_replace (نمط مختلط، استبدال مختلط، موضوع مختلط [، حد int])
يبحث في الموضوع عن مطابقات نمط النمط ويستبدلها بالاستبدال. إذا تم تحديد الحد، فسيتم استبدال مطابقات الحد فقط إذا تم حذف الحد أو كانت قيمته -1، فسيتم استبدال جميع المطابقات.
يمكن أن يحتوي الاستبدال على مرجع خلفي في النموذج \n أو (منذ PHP 4.0.4) في النموذج $n، مع تفضيل الأخير. سيتم استبدال كل مرجع من هذا القبيل بنص يطابق النمط الفرعي رقم 1 الذي تم التقاطه بين قوسين. يمكن أن يتراوح n من 0 إلى 99، حيث يشير \0 أو $0 إلى النص المطابق للنمط بأكمله. قم بعد الأقواس اليسرى من اليسار إلى اليمين (بدءًا من 1) للحصول على عدد الأنماط الفرعية.
بالنسبة لأنماط الاستبدال التي تتبع مرجعًا خلفيًا برقم (أي رقم يتبع نمط المطابقة مباشرة)، لا يمكن استخدام الترميز المألوف \1 لتمثيل المرجع الخلفي. على سبيل المثال، سيؤدي \11 إلى جعل preg_replace() في حيرة من أمره بشأن ما إذا كان يريد مرجعًا خلفيًا لـ \1 متبوعًا بالرقم 1 أو مرجع خلفي لـ \11 . الحل في هذه الحالة هو استخدام ${1}1. يؤدي هذا إلى إنشاء مرجع خلفي معزول لـ $1، تاركًا الآخر مجرد حرفي.
إذا تم العثور على تطابق، فسيتم إرجاع الموضوع المستبدل، وإلا سيتم إرجاع الموضوع الأصلي.
يمكن أن تكون كل معلمة من preg_replace() (باستثناء الحد) عبارة عن مصفوفة. إذا كان كل من النمط والاستبدال عبارة عن مصفوفات، فستتم معالجتهما بالترتيب الذي تظهر به مفاتيحهما في المصفوفة. وهذا ليس بالضرورة نفس الترتيب الرقمي للمؤشر. إذا تم استخدام فهرس لتحديد النمط الذي سيتم استبداله بالاستبدال، فيجب فرز المصفوفة باستخدام ksort() قبل استدعاء preg_replace().
إذا كان الموضوع عبارة عن مصفوفة، فسيتم إجراء بحث واستبدال على كل عنصر في الموضوع ويتم إرجاع المصفوفة.
إذا كان النمط والاستبدال عبارة عن مصفوفتين، فسيقوم preg_replace() بإخراج القيم منهما للبحث عن الموضوع واستبداله. إذا كانت القيم في الاستبدال أقل من تلك الموجودة في النمط، فسيتم استخدام سلسلة فارغة كقيمة الاستبدال المتبقية. إذا كان النمط عبارة عن مصفوفة والاستبدال عبارة عن سلسلة، فسيتم استخدام هذه السلسلة كقيمة استبدال لكل قيمة في النمط. والعكس لا معنى له.
يؤدي المُعدل /e إلى قيام preg_replace() بمعاملة وسيطة الاستبدال كرمز PHP (بعد استبدال المراجع الخلفية المناسبة). نصيحة: تأكد من أن الاستبدال يشكل سلسلة تعليمات برمجية PHP صالحة، وإلا فإن PHP ستبلغ عن خطأ في تحليل بناء الجملة على السطر الذي يحتوي على preg_replace().
ملاحظة: تمت إضافة المعلمة Limit بعد PHP 4.0.1pl2.
أعتقد أن قوتها لا تكمن في قدرتها على التعامل مع السلاسل فحسب، بل أيضًا المصفوفات، كما أن وظيفة المرجع العكسي الخاصة بها مرنة للغاية. في الأساس، يمكنها تلبية معظم احتياجات المستخدمين العاديين. إذا لم تكن مؤهلة، فلدينا أيضًا وظيفة preg_replace_callback()، والتي يمكنها تخصيص وظيفة رد الاتصال لتلبية متطلباتك المتقدمة. مثل تصميم المرشحات وغيرها.
preg_replace_callback
(PHP 4 >= 4.0.5، PHP 5)
preg_replace_callback - استخدم وظيفة رد الاتصال لإجراء بحث عن التعبير العادي واستبدال التعليمات
preg_replace_callback المختلط (نمط مختلط، رد اتصال رد اتصال، موضوع مختلط [، حد int])
تتصرف هذه الوظيفة تقريبًا مثل preg_replace()، باستثناء أنه بدلاً من توفير معلمة بديلة، يتم تحديد وظيفة رد اتصال. تأخذ هذه الوظيفة مجموعة من التطابقات في السلسلة الهدف كمدخلات وتقوم بإرجاع السلسلة المستخدمة للاستبدال.
مثال 1. مثال preg_replace_callback()
<?php
// هذا النص لعام 2002،
// الآن نريد إتاحته لعام 2003
$text = "يوم كذبة إبريل هو 01/04/2002n";
$text.= "عيد الميلاد الماضي كان بتاريخ 24/12/2001n";
// وظيفة رد الاتصال
الوظيفة next_year(مطابقات $) {
// عادةً: $matches[0] هو التطابق الكامل
// $matches[1] هو المطابق للنمط الفرعي في القوس الأول
// وهكذا
إرجاع $matches[1].($matches[2]+1);
}
صدى preg_replace_callback(
"|(d{2}/d{2}/)(d{4})|"،
"العام القادم"،
نص $)؛
// النتيجة هي:
// يوم كذبة أبريل هو 01/04/2003
// عيد الميلاد الماضي كان في 24/12/2002
?>
ستحتاج غالبًا إلى وظيفة رد الاتصال لـ preg_replace_callback() في مكان واحد فقط، وفي هذه الحالة يمكنك استخدام create_function() للإعلان عن وظيفة مجهولة كرد اتصال ضمن استدعاء preg_replace_callback() احصل على جميع المعلومات الخاصة بالمكالمة في مكان واحد ولا تزدحم مساحة اسم الوظيفة باسم وظائف رد اتصال غير مستخدم في أي مكان آخر.
بالنسبة للأصدقاء الذين يستخدمون وظيفة preg_replace_callback()، ربما تحتاج إلى وظيفة رد الاتصال (وإلا، فلماذا تستخدمها؟ أليس من الأفضل استخدام preg_replace مباشرة)، ولكن غالبًا ما يتم استخدامها في مكان واحد فقط. في هذه الحالة، يمكنك استخدام create_function() للإعلان عن وظيفة مجهولة كوظيفة رد اتصال لـ preg_replace_callback(). وبهذه الطريقة، نلبي الحاجة إلى الإعلان عن المعلومات دون الخلط بين اسم الوظيفة الذي لن يتم استخدامه مرة أخرى.
مثال 2. preg_replace_callback() و create_function()
<?php
/* عامل تصفية سطر الأوامر بنمط UNIX الذي يزيل السلسلة الموجودة في بداية كل فقرة
*تحويل الحروف الكبيرة إلى أحرف صغيرة*/
$fp = fopen("php://stdin", "r") أو die("لا يمكن قراءة stdin");
بينما (!feof($fp)) {
$line = fgets($fp);
خط $ = preg_replace_callback(
'|<p>s*w|',
create_function(
// يعد استخدام علامات الاقتباس المفردة هنا أمرًا بالغ الأهمية،
// بخلاف ذلك، استبدل كل $ بـ $
"مطابقات $"،
"إرجاع strtolower($matches[0]);"
)،
خط $
);
صدى خط $؛
}
fClose($fp);
?>
أخيرا
preg_split
(PHP 3 >= 3.0.9، PHP 4، PHP 5)
preg_split – قم بتقسيم سلسلة باستخدام التعبيرات العادية ولن أخوض في التفاصيل هنا.
يوضح
يقوم المصفوفة preg_split ( نمط السلسلة، موضوع السلسلة [، حد int [، إشارات int]] )
بإرجاع مصفوفة تحتوي على السلاسل الفرعية في الموضوع المقسم على طول الحدود المطابقة للنمط.
إذا تم تحديد الحد، فسيتم إرجاع السلاسل الفرعية ذات الحد الأقصى إذا كان الحد هو -1، فهذا يعني أنه لا يوجد حد ويمكن استخدامه لمواصلة تحديد إشارات المعلمات الاختيارية.
يمكن أن تكون الأعلام أي مجموعة من الأعلام التالية (مدمجة مع عامل البت OR | ):
PREG_SPLIT_NO_EMPTY
إذا تم تعيين هذه العلامة، فإن الدالة preg_split() تُرجع فقط المكونات غير الفارغة.
PREG_SPLIT_DELIM_CAPTURE
إذا تم تعيين هذه العلامة، فسيتم أيضًا التقاط تعبيرات الأقواس في أنماط المحددات وإرجاعها. تمت إضافة هذه العلامة في PHP 4.0.5.
PREG_SPLIT_OFFSET_CAPTURE
إذا تم تعيين هذه العلامة، فسيتم أيضًا إرجاع إزاحة السلسلة المرتبطة لكل تواجد للنتيجة المطابقة. لاحظ أن هذا يغير قيمة المصفوفة التي تم إرجاعها بحيث تكون كل خلية هي أيضًا مصفوفة، حيث يكون العنصر الأول هو السلسلة المتطابقة والعنصر الثاني هو إزاحته داخل الموضوع. هذه العلامة متاحة منذ PHP 4.3.0.
نصيحة: إذا لم تكن بحاجة إلى قوة التعبيرات العادية، يمكنك اختيار استخدام بدائل أسرع (وأبسط) مثل Explode() أو str_split().