Eğer düzenli ifadenin desen kısmında başvuruları geri kullanabilir miyim?

3 Cevap php

Normal ifade deseninde başvuru yedeklemek için bir yolu var mı?

Example input string:

Here is "some quoted" text.

Ben alıntı metni dışarı çekmek istiyorsanız söyleyin, ben şu ifadeyi oluşturabilirsiniz:

"([^"]+)"

Bu düzenli ifade maç olacak some quoted.

Ben ifadeyi değiştirebilir, o da tek tırnak desteklemek istiyorsanız söyleyin:

["']([^"']+)["']

Ama ne giriş dizesi tırnak karışımı Here is 'some quoted" text. ben regex maç istemem söylüyorlar varsa. Şu anda ikinci örnekte regex hala maç olacaktır.

İlk alıntı, bir çift tırnak ise ne yapmam mümkün istiyorum o zaman kapanış tırnak bir çift olmalıdır. Başlangıç ​​alıntı tek tırnak ise ve sonra kapanış tırnak tek olmalıdır.

Bunu başarmak için bir geri başvuru kullanabilir miyim?


My other related question: http://stackoverflow.com/questions/2723325/getting-text-between-quotes-using-regular-expression

3 Cevap

Sen regex yararlanabilirler:

(["'])[^"']+\1
  • (): gruplandırma için kullanılır
  • [..] : is the char class. so ["'] matches either " or ' equivalent to "|'
  • [^..] : char class with negation. It matches any char not listed after the ^
  • +: bir veya daha fazla için nicelik
  • \1 : backreferencing the first group which is (["'])

: In PHP siz bu kullanmak istiyorum

preg_match('#(["\'])[^"\']+\1#',$str)

Working example

preg_match('/(["\'])([^"\']+)\1/', 'Here is \'quoted text" some quoted text.');

Açıklama: (["'])([^"']+)\1/ Ben parantez içinde ilk teklif yerleştirilir. Bu ilk gruplandırma olduğundan, referans numarası 1 geri döndü. Ardından, kapanış tırnak nerede olacağını, ben demektir \ 1 yerleştirilen whichever character was matched in group 1.

/"\(.*?\)".*?\1/ çalışır, ancak düzenli ifade motoru bağlıdır gerekir