تحتاج Regex إلى تحليل الكلمة الأساسية = "القيمة" مع اقتباسات واحدة أو مزدوجة

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

  •  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\""

ومع ذلك، يكون لديه قيود في ذلك إذا كانت القيمة مفقودة للمفتاح من قراءة زوج المفتاح / القيمة التالي. يمكن معالجة هذا باستخدام قائمة فاصلة مفصولة من أزواج المفتاح / القيمة.

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