Her şey, ama aralarında [ve] her şey

7 Cevap php

Herşeyi maç için çalışıyoruz, ama her şey arasında [ve] ediyorum.

[ve] arasında her şey

\[.+\]

everything, but [ve] arasında her şey

[^(\[.+\])]+

Arama metin

valid[REGEX_EMAIL|REGEX_PASSWORD|REGEX_TEST]

Bu "geçerli" ve "| REGEX_PASSWORD | REGEX_TEST REGEX_EMAIL" eşleşir.

Bu "geçerli" eşleştirmek gerekiyordu, ama "REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST" dir.

Nasıl çözmek için?

Benim php doğrulama sınıf CodeIgniter gibi olmak istiyorum ...

7 Cevap

Eğer 'geçerli [| REGEX_PASSWORD | REGEX_TEST REGEX_EMAIL]' kullanarak konum verilerine göre bu deneyin

^[^[]+   

Bu "geçerli" dönecektir.

Kullandığınız hiçbir dili olarak, [kaçmak gerekir, bu nedenle gibi yazmak belki bu ^[^\[]+

Bu regex [REGEX_EMAIL önceki metinde "[" Orada asla varsayar | REGEX_PASSWORD | REGEX_TEST]

Ben. NET için Eric Gunnerson en RegexWorkbench kullanarak bu test

[^(\[.+\])]+ Sence anlamı ne anlama gelmez.

Kelimenin tam anlamıyla, "any Bunlardan birinde () [. +] Bir veya daha fazla kez dışında herhangi bir karakterle eşleşir." Anlamına gelir

[] (bir ^ ile başlıyorsa ya da değil onları eşleştirerek) bu set içinde karakterlerden birine karşı eşleşen bir karakter kümesi

Ben negatif ileri yönlü denir ne cevap bulacaksınız inanıyorum. Bu, aslında maç olarak dahil olmadan arama desenleri dahil sağlar.

/^.*(?!\[.+\])$/

(?! ...) Negatif ileri yönlü bir parçası olmak.

I CI's Validation class artık kaynak kodunu kontrol ettik.

Onlar kuralları gibi ayarlanmasına izin

array('field' => "valid|length[5]|foo|callback_bar")

Ben köşeli parantez içinde herhangi bir iç içe köşeli veya borularını görmedim. Docs açıkça sadece bir param olabilir, söylüyorlar. Dize $_rules dahili ayarlanır. Doğrularken, dize exploded ilk kez bir diziye olacak, bu yüzden yukarıdaki dört değerlendirmek istiyorum $rules.

'field' => array('valid', 'length[5]', 'foo', 'callback_bar')

Dizi aracılığıyla Daha sonra döngü, $rule substr() ile bir geri çağırma olup olmadığını kontrol ediyor. Sonra "/(.*?)\[(.*?)\]/" $rule deseni ile kare parantez olup olmadığını kontrol edin ve eğer öyleyse, $rule onu almak ve parantez iç kısmını saklamak olarak $param. Ve son olarak, onlar sadece tespit param ile bir değişken fonksiyonu, örneğin gibi $rule yürütmek $rule(POST[$field], 5);

Gördüğünüz gibi, onlar tek seferde her şeyi bölme değildir. Bu sorunuza cevap vermez, ama onların Validator çalışan almak için CI iç mantığına biraz ışık tutmak size yaklaşımı yeniden düşünmek yardımcı olabilir.

Opinion: Ben onların yaklaşımı korkunç olduğunu eklemek istiyorum. Validator Zincirler Command Pattern için başbakan adayı olan. Tabii, bu küçük ve kompakt dizeleri ile doğrulayıcılar belirtmek için güzel, ama aslında zinciri çalışırken gelince, çirkin dize hokkabazlık bir sürü tarafından bu ödeme. Zend Framework bunu yapar veya PHPs native filter functions bakmak nasıl bir görünüm var.

Eğer doğru anlamak, bu, metnin üç farklı türlü:

  1. İlk [kadar başından itibaren
  2. Arasında a] ve [
  3. Son gelen] sonuna kadar

Bu göz önüne alındığında, her biri için bir düzenli ifade vardır:

  1. ^([^\x5B]*)[
  2. ]([^\x5B\x5D]*)[
  3. ]([^\x5D]*)$

(. X5b ve X5D altıgen sağ ve sol dirsek için kaçar vardır) tüm ifadenin maçı sınırlarını işaretlemek parantez içerecektir unutmayın; sub-ifadesi 1 dirsek hariç maç verir.

(Kendisi esir değildir) pozitif bir görünüm öncesinde iddiasını deneyin

^.*(?=\[.+\])

Sen Regex Tester olduğunda, düzenli ifadelerin bir usta olmak zorunda değilsiniz. Eğer istenilen sonucu elde edene kadar sadece bazı test verileri yazın ve bir regex ile oynayabilirsiniz. Sağ tarafta size yardımcı olmak için Hızlı Başvuru vardır.

Eh, en azından ben onlarla nasıl başa bulunuyor.