التجميع أمام النظرة الخلفية الإيجابية غير متطابق
سؤال
خذ الكود التالي:
$target = 'NAME FUNC LPAREN P COMMA P COMMA P RPAREN';
//$target = 'NAME FUNC LPAREN P RPAREN';
//$target = 'NAME FUNC LPAREN RPAREN';
$pattern = '/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:(?<=LPAREN)(?: (?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA)))/';
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
أحتاج إلى الحصول على موضع NAME وFUNC وكل P ضمن الهدف $ (وبالتالي PREG_OFFSET_CAPTURE).يعمل هذا النمط مع Ps، ولكنه لا يتطابق مع أي من المجموعتين المُسميتين "ruleName" أو "funcName".
ماذا ينقصني؟
شكرًا.
المحلول
أعتقد أنني وجدت السبب.
- تعتبر المراجع الخلفية المسماة اختيارية.
- إذا كانت متطابقة (وفي المحاولة الأولى تطابقت)، فإن محرك التعبير العادي يقف على يسار "LPAREN".
- الرمز المميز التالي الذي يحاول محرك regex مطابقته هو حرف مسافة.وذلك لأن التعبير lookbehind
(?<=LPAREN)
لا يستهلك الأحرف في السلسلة. - لا يمكن أن يتطابق مع المساحة نظرًا لوجود حرف L
- يتجاهل محرك regex المطابقات الاختيارية من 2.ويستمر حتى يجد المساحة التالية.
- إنه يتطابق ويستمر في المطابقة منذ ذلك الحين فصاعدًا، ويلتقط كل شيء
P
س.لكن كان لا بد من التخلي عن المجموعات المذكورة حتى ينجح هذا الأمر.
لست متأكدًا من سبب حاجتك إلى النظرة الخلفية.ماذا عن
/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/
لا تنتمي إلى StackOverflow