الدالة preg_replace_callback()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ في PHP

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

(PHP 4 >= 4.0.5, PHP 5, PHP 7)

تبحث الدالة preg_replace_callback()‎‎ عن تعبير نمطي وتستبدله باستخدام دالة مُعرَّفة من المستخدم.

الوصف

mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit= -1 [, int &$count ]] )

يتطابق سلوك هذه الوظيفة تقريبًا مع الدالة preg_replace()‎‎، باستثناء أنه يجب تحديد الدالة المُعرَّفة من المستخدم callback بدلاً من المعامل replacement.

المعاملات

pattern

النمط المراد البحث عنه. ويمكن أن يكون إما سلسلةً نصيةً أو مصفوفةً من السلاسل النصية.

callback

الدالة المُعرَّفة من المستخدم التي تُستدعى وتُمرِر مصفوفة من العناصر المطابقة في السلسلة النصية الهدف subject. يجب أن تُعيد الدالة المعرفة من المستخدم سلسلة الاستبدال النصية. هذا هو توقيع الدالة المعرفة من المستخدم:

string handler ( array $matches )

سنحتاج غالبًا إلى دالة callback لاستخدام الدالة preg_replace_callback()‎‎ في مكان واحد فقط. في هذه الحالة، يمكننا استخدام دالة مجهولة لتعريف الدالة المُعرَّفة من المستخدم داخل استدعاء preg_replace_callback()‎‎. بهذه الطريقة يتوفر لدينا كافة المعلومات الخاصة بالاستدعاء في مكان واحد، ولا تسبب الفوضى في أسماء الدوال باستخدام اسم دالة مُعرَّفة من المستخدم تكون غير متواجدة في أي مكان آخر. المثال 1: مثال على الدالة preg_replace_callback()‎‎ ووظيفة مجهولة

<?php
/* مُرشِح من سطر الأوامر بأسلوب يونيكس لتحويل الحروف الكبيرة
* في بداية الفقرات إلى حروف صغيرة */
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
   $line = fgets($fp);
   $line = preg_replace_callback(
       '|<p>\s*\w|',
       function ($matches) {
           return strtolower($matches[0]);
       },
       $line
   );
   echo $line;
}
fclose($fp);
?>

subject

السلسلة النصية، أو مصفوفة من السلاسل النصية المراد البحث والاستبدال فيها.

limit

أقصى عدد بدائل ممكنة من كل نمط متواجد في كل سلسلة subject. قيمته الافتراضية ‎-1 (بلا ​​حدود).

count

إذا حُدِد  تصبح قيمة هذا المتغير تساوي عدد عمليات الاستبدال.

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

تُعيد هذه الدالة مصفوفةً إذا كانت المعامل subject يمثل مصفوفة، أو تُعيد سلسلةً نصية خلاف ذلك. في حالة وجود خطأ تكون القيمة المعادة هي NULL.

إذا عُثِرَ على تطابقات، تُعاد السلسلة النصية الهدف االجديدة، وإلا تُعاد السلسلة الهدف الأصلية subject دون تغيير.

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

الإصدار وصف
5.1.0 إضافة المعامل count

أمثلة

المثال 2: مثال على الدالة preg_replace_callback()‎‎

<?php
// اُستُخدِم هذا النص في عام 2002
// نريد أن نحصل على هذا التحديث لعام 2003
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// the callback function
function next_year($matches)
{
  // كالعادة: $ match [0] هي المطابقة الكاملة
 // مع $ match [1] التطابق مع أول نمط فرعي
 // مُحاط بالأقواس '(...)' وهلم جرا
 return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
           "|(\d{2}/\d{2}/)(\d{4})|",
           "next_year",
           $text);
?>

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

April fools day is 04/01/2003
Last christmas was 12/24/2002

المثال 3: مثال على الدالة preg_replace_callback()‎‎ باستخدام بنية متكررة لمعالجة رمز BB المغلف

<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function parseTagsRecursive($input)
{

    $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;
?>

انظر أيضًا

مصادر

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