تحتاج Regex إلى تحليل الكلمة الأساسية = "القيمة" مع اقتباسات واحدة أو مزدوجة
-
12-09-2019 - |
سؤال
أواجه مشكلة في كتابة تعبير منتظم (مناسبة ل PREG_MACH () PHP ()) التي ستحليل الكلمات الرئيسية = "قيمة" أزواج بغض النظر عما إذا كانu003Cvalue> سلسلة محاطة في اقتباسات واحدة أو مزدوجة. iow في كل من الحالات التالية التي أحتاجها للحصول علىu003Cname> وu003Cvalue> أين الu003Cvalue> قد تحتوي السلسلة على نوع غير مرفق من الاقتباسات:
name="value"
name='value'
المحلول
في بيرل هذا تعبير منتظم من شأنه أن يعمل. مطابقة لأول مرة لبداية السطر، ثم تطابق واحد أو أكثر من الأحرف غير = ويضعها إلى 1 دولار. التالي يبحث عن = ثم بين الأقواس مع اختيار مطابقة "أو" وتعيين ذلك إلى 2 دولار.
/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/
إذا كنت تريد أن تتطابق مع تعبيرات فارغة مثل.
هذا = ""
استبدال آخرين + مع * خلاف ذلك يجب أن يعمل هذا
يحرركما ذكر في التعليقات. دوغ المستخدمة ...
/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
سيؤدي ذلك إلى مطابقة مساحة بيضاء اختيارية واحدة على نهاية الأثير للإدخال أو القيمة وأزلت نهاية علامة الخط.
نصائح أخرى
/^(\w+?)=(['"])(\w+?)\2$/
والتي سوف تضع المفتاح في $1
والقيمة في $3
.
في وقت متأخر بعد سنوات قليلة، ولكن نظرا لأن هذا السؤال مرتبة عالية على Google، وكانت الإجابات لم ترضي احتياجاتي، وهنا شيء آخر التعبير:
(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2
سيؤدي ذلك إلى مطابقة اقتباسات واحدة أو مزدوجة، مع الأخذ في الاعتبار اقتباسات النفايات والقيم غير المسبقة.
name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""
ومع ذلك، يكون لديه قيود في ذلك إذا كانت القيمة مفقودة للمفتاح من قراءة زوج المفتاح / القيمة التالي. يمكن معالجة هذا باستخدام قائمة فاصلة مفصولة من أزواج المفتاح / القيمة.