تمرير تعليق عادي متعدد الأسطر (مساحة حرة) إلى preg_match

StackOverflow https://stackoverflow.com/questions/22552

  •  09-06-2019
  •  | 
  •  

سؤال

لدي تعبير عادي سينتهي به الأمر إلى أن يكون طويلًا بعض الشيء وسيكون من الأسهل قراءته عبر عدة أسطر.

لقد حاولت هذا لكنه مجرد barfs.

preg_match(
    '^J[0-9]{7}:\s+
    (.*?)             #Extract the Transaction Start Date msg
    \s+J[0-9]{7}:\s+Project\sname:\s+
    (.*?)             #Extract the Project Name
    \s+J[0-9]{7}:\s+Job\sname:\s+
    (.*?)             #Extract the Job Name
    \s+J[0-9]{7}:\s+',
    $this->getResultVar('FullMessage'),
    $atmp
);

هل هناك طريقة لتمرير التعبير العادي في النموذج أعلاه إلى preg_match؟

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

المحلول

يمكنك استخدام بناء الجملة الموسع:

preg_match("/
    test
/x", $foo, $bar);

نصائح أخرى

نعم يمكنك إضافة /x معدل النمط.

يعمل هذا المعدل على وظائف إضافية من PCRE غير متوافقة مع Perl.أي غزال عكسي في نمط يتبعه خطاب ليس له معنى خاص يؤدي إلى خطأ ، وبالتالي الاحتفاظ بهذه المجموعات للتوسع في المستقبل.بشكل افتراضي ، كما هو الحال في Perl ، يتم التعامل مع الانزلاق الخلفي متبوعًا بخطاب بدون معنى خاص على أنه حرفي.لا يوجد في الوقت الحاضر أي ميزات أخرى يتحكم فيها هذا المعدل.

على سبيل المثال الخاص بك حاول هذا:

preg_match('/
              ^J[0-9]{7}:\s+
              (.*?)             #Extract the Transaction Start Date msg
              \s+J[0-9]{7}:\s+Project\sname:\s+
              (.*?)             #Extract the Project Name
              \s+J[0-9]{7}:\s+Job\sname:\s+
              (.*?)             #Extract the Job Name
              \s+J[0-9]{7}:\s+
            /x', $this->getResultVar('FullMessage'), $atmp);
  • يجب عليك إضافة محددات:سيتم استخدام الحرف الأول من regex للإشارة إلى نهاية النمط.
  • يجب عليك إضافة علامة "x".هذا له نفس نتيجة وضع (؟x) في البداية، لكنه أكثر قابلية للقراءة.

حسنًا، إليك الحل:

preg_match(
                '/(?x)^J[0-9]{7}:\s+
                (.*?)             #Extract the Transaction Start Date msg
                \s+J[0-9]{7}:\s+Project\sname:\s+
                (.*?)             #Extract the Project Name
                \s+J[0-9]{7}:\s+Job\sname:\s+
                (.*?)             #Extract the Job Name
                \s+J[0-9]{7}:\s+/'
                , $this->getResultVar('FullMessage'), $atmp);

المفتاح هو (؟x) في البداية مما يجعل المسافة البيضاء غير ذات أهمية ويسمح بالتعليقات.

من المهم أيضًا عدم وجود مسافة بيضاء بين علامتي اقتباس البداية والنهاية وبداية ونهاية التعبير العادي.

محاولتي الأولى مثل هذه أعطت أخطاء:

preg_match('
                /(?x)^J[0-9]{7}:\s+
                (.*?)             #Extract the Transaction Start Date msg
                \s+J[0-9]{7}:\s+Project\sname:\s+
                (.*?)             #Extract the Project Name
                \s+J[0-9]{7}:\s+Job\sname:\s+
                (.*?)             #Extract the Job Name
                \s+J[0-9]{7}:\s+/
           ', $this->getResultVar('FullMessage'), $atmp);

ماذا قال كونراد يعمل أيضًا ويشعر بأنه أسهل قليلاً من الالتصاق (؟x) في البداية.

في PHP تبدو صيغة التعليق كما يلي:

(?# Your comment here)

preg_match('
            ^J[0-9]{7}:\s+
            (.*?)             (?#Extract the Transaction Start Date msg)
            \s+J[0-9]{7}:\s+Project\sname:\s+
            (.*?)             (?#Extract the Project Name)
                \s+J[0-9]{7}:\s+Job\sname:\s+
            (.*?)             (?#Extract the Job Name)
            \s+J[0-9]{7}:\s+
            ', $this->getResultVar('FullMessage'), $atmp);

لمزيد من المعلومات راجع PHP مرجع بناء الجملة التعبير العادي

يمكنك أيضًا استخدام PCRE_EXTENDED (أو "x") معدل النمط كما يظهر مارك في مثاله.

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