سؤال

أحاول الحصول على regexp لمطابقة بعض العلامات المتداخلة. (نعم أعلم أنني يجب أن أستخدم محللًا ، لكن إدخالاتي ستكون صحيحة).

مثال:

Text.
More text.
[quote]
First quote
[quote]
Nested second quote.
[/quote]
[/quote]

دعنا نقول أنني أريد أن يغير regexp العلامات ببساطة <blockquote>:

Text.
More text.
<blockquote>
First quote
<blockquote>
Nested second quote.
</blockquote>
</blockquote>

كيف يمكنني القيام بذلك ، مطابقة كل من العلامات الفتح والإغلاق في نفس الوقت؟

هل كانت مفيدة؟

المحلول

لا يمكنك مطابقة الأشياء المتداخلة (بشكل تعسفي) مع تعبيرات منتظمة.

ولكن يمكنك استبدال كل مثيل [quote] مع <blockquote> و [/quote] مع </blockquote>.

نصائح أخرى

إذا كنت لا تمانع في الصواب ، فيمكنك استخدام استبدال السلسلة البسيط واستبدال كل علامة بشكل منفصل. إليك بعض الأمثلة باستخدام PHP str_replace لاستبدال العلامات الافتتاحية والإغلاق:

$str = str_replace('[quote]', '<blockquote>', $str);
$str = str_replace('[/quote]', '</blockquote>', $str);

أو بمساعدة تعبير منتظم (PHP مرة أخرى):

$str = preg_replace('~\[(/?)quote]~', '<$1blockquote>', $str);

هنا مباريات \[(/?)quote] يتم استبدالها <$1blockquote> أين $1 يتم استبداله بمطابقة المجموعة الأولى من النمط ((/?), ، أيضاً / أو فارغ).

ولكن يجب عليك حقًا استخدام محلل تتبع علامات الافتتاح والإغلاق. وإلا يمكن أن يكون لديك علامة فتح أو إغلاق لا تحتوي على نظير أو (إذا كنت تستخدم علامات أخرى) لا يتم تجديدها بشكل صحيح.

إنها فكرة رديئة ، لكن يبدو أنك تحاول مطابقة شيء مثل: \[\(/?\)quote\] واستبدله بـ: <\1blockquote>

يمكنك استخدام 2 تعبيرات.

s/\[quote\]/\<blockquote\>/
s/\[\/quote\]/\<\/blockquote\>/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top