Düzenli ifade kullanarak tırnak arasına alma metin

2 Cevap php

Ben yaratıyorum bir düzenli ifade ile bazı sorunlar yaşıyorum.

Ben aşağıdaki örnek ve ilk alıntı dizesi daha sonra alt maçında karşı uygun bir regex gerekir:

Input strings

("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ')

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 'arg1', "arg2")

Must sub match

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Regex so far:

\((["'])([^"']+)\1,?.*\)

Regex tırnak ilk seti arasındaki metin üzerinde bir alt eşleşmesinin yukarıda görüntülenen alt maçı döndürür.

Bu neredeyse mükemmel çalışıyor, ama bende sorun aktardığı dize metinde tırnak içeriyorsa alt maç aşağıya bakın, ilk aşamada durur olduğunu:

Failing input strings

("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")

Sadece alt karşılaşmalar: Lorem ipsum dolor

("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")

Bütün maç başarısız olur.

Notes

Giriş dizeleri aslında php kod fonksiyon çağrıları vardır. Ben belirli bir işlev için. Php kaynak dosyaları tarayabilir ve ilk parametre metni çekecek bir senaryo yazıyorum.

2 Cevap

Bu normal ifade deneyin:

\(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\)

Bazı açıklama:

  • \(\s\* parantez açma ve isteğe bağlı boşluk eşleşir.
  • (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*') is to match any quoted string allowing the quote character only when escaped with \.
  • (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))* describes zero or more quotes strings, preceded by a , o öncesinde ve boşluk tarafından takip edilebilir.
  • \s*\) isteğe bağlı boşluk ile kapanış parantezi eşleşir.

o kaçtığı zaman bir teklif eşleşmiyor emin olun (bu öncesinde bir ters eğik çizgi vardır):

/\((["'])([^"']+)[^\\]\1,?.*?\)/