Düzenli ifadeler için düzenli ifade?

5 Cevap php

Possible Duplicate:
Is there a regular expression to detect a valid regular expression?
Regular expression for finding a regular expression?

Ben kullanıcı girişi düzenli bir ifade olanak sağlayan bir uygulama var. Onlar orada yoksa preg_match hatalar olacaktır, çünkü nasıl, düzenli ifadelerin herhangi bir giriş karşı kontrol ve geçerli olanlar emin olabilirim?

Ben iyi olurum düzenli ifadelerin kullanıcı girişi geçerliliğini kontrol etmek için bir yol varsa preg_match'in önce '@' kullanmak istiyorum, bu yüzden yok.

PHP düzenli ifade sistem bana onlar için normal bir ifade ile gelip için oldukça çok karmaşık gibi görünüyor.

5 Cevap

preg_mBirtch() döner FALSE bir hBirtBir oluştu eğer.

  1. sunucuyBir ifBirde göndermek
  2. preg_mBirtch boş bir dize
  3. Bir hBirtBir oluşursBir görmek

You cBirn either use AjBirx to vBirlidBirte reBirl time, or vBirlidBirte Birfter form submit.
You cBirn Birlso try to vBirlidBirte by feeding the expression to jBirvBirscript regexp engine, but js regexp syntBirx is not 100% compBirtible with the php one.

Matematiksel olarak, bir düzenli ifade kullanarak bir düzenli ifade doğrulamak mümkün değildir. Bu yüzden (formal) düzenli ifadeler sadece tanımak çünkü regular languages. Bir dil herhangi bir set dizeleri olduğunu. Örneğin, tüm ondalık sayılar kümesi (arada bir düzenli ifade kullanarak tarif edilebilir) bir dildir; Tüm geçerli düzenli ifadelerin kümesi de bir dildir. Regular dilleri kabul edilmesi için sadece fixed finite memory (giriş boyutu değil işlevi) gerektiren dillerdir.

Tüm geçerli düzenli ifadeler içeren dili düzenli bir dil değildir; dolayısıyla bir düzenli ifade kullanarak bir düzenli ifade tanımak mümkün değildir.

Bunu anlamak için, düzenli ifadeler eşleşmelidir onlara parantez içerdiğini fark. Bu nedenle, bir "(" oluştu, a ")" daha sonra ortaya gerekiyorsa. Bu sadece sonlu bellek, sabit bir makine ile açıklamak mümkün değildir. Orada were bir bunu yapmak için bir yol, ve düzenli ifade (bazı tamsayı K için) K farklı devletlerin sonlu bir hafıza, K açıklığı olan bir ifade olsaydı, ardından parantez için K parantez kapatma, geçerli bir normal ifade unable Bu makine tarafından tanınması için olurdu ama - bir contradiction (haber resmi dilde, bizim varsayım bu metin işleme biriyle oluşur olduğunu uygulanan normal ifadeler için aynı sağa, soldan) bir seferde bir karakter. Biz düzenli ifadeler context-free olup regular açıklayan biri olarak dil diyoruz.

(Düzenli ifadeler Pumping Lemma kullanarak düzenli bir dil oluşturma olmadığını kanıtlamak için önemsiz)

Yani, düzenli ifadeler kullanarak düzenli ifadeleri tanımada temel bir bilgisayar sorun var: It is mathematically impossible to do so.

Düzenli diller sonlu states ile finite-state automata, yani makineler tarafından ancak bellek olmadan kabul edilmesi mümkündür. Senin sorunun üstesinden gelmek için, giriş büyüklüğüne bağlıdır bazı bellek eklemeniz gerekir. Onlar bağlam ücretsiz olarak düzenli ifadeler, (neyse ki onlar değil, bazı karanlık, zor tanımak dil türü) bir push-down otomat kullanarak doğrusal zamanda kabul edilebilir. Bu bir bir defada ifade bir belirteci (genellikle bir karakter) geçer ve o verileri "iter", yani, bir stack görülen ne izler döngüsü "için" o laters "çıkar "İlk-in-son-out moda. (Veri örneği yığına: "Ben` a eş bulmak için hatırlamak gerek) 'sonra! "; İhtiyacınız kadar bu kadar çok kez "push" olabilir; Eğer gerçekten needed daha önce bir parantez açma uyumlu olması için kontrol gerektiğinde), daha sonra "pop" olabilir.

Tabii, düzenli ifadeler için kendi tanıma motoru yazılı bir yükü biraz olurdu - ama bunu yapmak istiyorsanız, yukarıda belirtilen sınırlamaları bilmeli. Bunu yapmak için zaten varolan bir mekanizma istihdam etmek daha akıllıca olacaktır - Ben normal bir ifade kütüphane veya Perl gibi normal ifadeleri kullanma hakkında daha istekli olan bir dil için bu işi verebilir şüpheli; Bu yavaş olabilir, ama yine de kullanıcıların olabilir girişi korkunç yavaş normal ifadeler;: ama @ metodu sonuçta bir fikir çok kötü gibi gelmiyor ve kötü bir uygulama olabilir, ama sizin durumunuzda bu mümkün olan en iyi çözüm gibi görünüyor.

Wikipedia ilgili bazı makaleler:

Ben bu yardımcı umut!

Kullanıcıların normal ifadeler göndermek icar neredeyse kesinlikle kötü bir fikir olduğunu.

Bazı ifadeler çok pahalı. Bu deneyin:

preg_match('/(.*){1,32000}[bc]/','aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')

ve bu giriş sadece 30 karakter var! /^(?:(\d+)|::)*$/ PCRE'nin üstel zaman da: hepsi bu da benzemiyorsun.

Akla gelen ilk yolu PREG_NO_ERROR daha sonra uygun bir hata mesajı ile cevap başka bir şey alırsanız preg_last_error() after calling preg_match($sanatized_user_regex, ""); kullanmaktır.

Sorunuzu biraz belirsiz. Eğer düzenli ifadenin 'sözdizimi' doğrulamak, ya da düzenli ifade aslında bir kez dize uygulanan içeriği ayrıştırır emin olmak için arıyoruz. Ben her iki durumda da, size (örneğin buna karşı kendi regex maç için bir dize girin bir hata ayıklama / metin kutusu sağlamak kullanıcıya doğrulama bırakmak gerektiğini düşünüyorum. Regex veya herhangi bir eşleşme bulunursa, gösterisi ile yanlış bir şey varsa Bir 'bulunamadı' hatası).

Regex kendisi doğrulama açısından, büyük ihtimalle sadece geçerli karakterler ($ gibi regex sözdizimi örn. parçası, ^ \ t vb) kendi regex parçası olup olmadığını kontrol eder, basit bir onaylayıcısına ile başlamak istiyorum, ama ben doğrulamak çalışıyorum düşünüyorum regex içindeki mantıksal yapıları oldukça karmaşık olabilir. Belki orada regex sözdizimi doğrulamak orada bazı kütüphaneler vardır, ama herhangi farkında değilim.