سؤال

أرغب في الحصول على جميع علامات "dev" والمحتوى الخاص بها من خلال php preg_match_all() ولكن لا يمكن الحصول على تلك المتداخلة.

بيانات:

<dev>aaa</dev> <dev>bbb</dev> <dev> ccc <dev>ddd</dev> </dev>

تعبيري حتى الآن:

|<dev>(.*)</dev>|Uis

thanks, for your help, b.

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

المحلول

لا تستخدم التعبيرات العادية للتحليل.استخدم محللًا حقيقيًا مثل DOMDocument أو SimpleXML:

$xml = simplexml_load_string('<root>'.$str.'</root>');

نصائح أخرى

يجب أن يكون لديك نمط مطابقة عودي:

/<dev>(.*|(?R))<\/dev>/i

سيؤدي ذلك إلى امتصاص أي عناصر متداخلة، لذا إذا كنت تريد تحليلها بعد ذلك، فسيتعين عليك تشغيل الوظيفة مرة أخرى على $matches[1]

ال * هو عامل جشع، يستهلك أكبر عدد ممكن من الشخصيات.يجب عليك استخدام *? إصدار غير جشع بدلاً من ذلك للعثور على أصغر التطابقات الممكنة.ربما لا تكون التعابير المنطقية هي أفضل الأدوات للقيام بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top