2016-02-27 15 views
7

Biraz araştırdık, ama ne gerek ve kapatma biraz ben ne gerek her zaman olduğu ifade oluşturmak için çalıştık her tam ilgilidir hiçbir şey bulunamadı. Düzenli ifadeler, yalnızca özel biçime izin verir. "John-doe"

Ben [AZaz09]{3,8}\-[AZaz09]{3,8} çizgisinde bir şey denedi.

Geçerli sonucun, yalnızca ya metinlerin alfabetik ya da sayısal olabildiği, ancak izin verilen tek sembolün - olduğu ve iki metin arasında olduğu metin metnine izin vermesini istiyorum.

Her metin en az üç karakter uzunluğunda olmalıdır ({3,8}?), Daha sonra - ile birbirlerinden ayrılmıştır.

geçerli olmak nedenle bazı örnekler şunlar olabilir:

Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 

Geçersiz testler şunlar olabilir:

Sen çapa kullanmaktan ve karakter sınıfında - böylece karakterleri kullanmak gerekir
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b% 
+1

Ayrıca aksanlı harfler veya başka alfabeler de eşleşmesini ister misiniz? "Déjà-vus", "12µ-13µ", "mañana-1234" gibi – trincot

+0

@ trincot: İyi bir nokta, cevabımı 'u' değiştiricisini yansıtacak şekilde güncelledim. – Jan

cevap

10

bireysel karakterler değil, bir aralık olarak okunur.

Dene:

^[A-Za-z0-9]{3,8}-[A-Za-z0-9]{3,8}$ 

Demo: Ayrıca i değiştirici ve \d meta karakteri ile ama bir basitleştirmek olabilir https://regex101.com/r/xH3oM8/1

.

(?i)^[a-z\d]{3,8}-[a-z\d]{3,8}$ 
+0

En iyi biri benim kullanım için mükemmel görünüyor :) – mhvvzmak1

+0

Ben sitede regex sonunda/gm olduğunu fark ettim, bu gm ne yapar ve gerekli? – mhvvzmak1

+2

'g' global bir değiştiricidir, m' çok satırlıdır. Bu sadece orada göstermek içindir. 'G' PHP’de desteklenmez. 'M''^$ ', tüm dizgeden ziyade her satırı eşleştirir. – chris85

4

aşağıdaki ile gelebilir: @ chris85 belirttiği gibi

<?php 
$string =" 
Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b%"; 

$regex='~ 
     ^\w{3,} # at last three word characters at the beginning of the line 
     -  # a dash 
     \w{3,}$ # three word characters at the end of the line 
     ~xm'; # multiline and freespacing mode (for this explanation) 
       # ~xmu for accented characters 

preg_match_all($regex, $string, $matches); 
print_r($matches); 
?> 

, \w yanı bir alt çizgi eşleşir. Trincot iyi bir yorumu vardı (aksanlı karakterlerle eşleşiyordu). Bunu başarmak için simply use the u modifier.
a demo on regex101.com ve a complete code on ideone.com bakınız.

+0

PHP, oradaki açıklamalarla çalışmayacak, bunu kendi başına kendi başına yapmalısınız. – chris85

+0

@ chris85, belki de 'x' değiştiricisini kontrol edin ... – trincot

+0

@ chris85: [Neden değil ???] (http://ideone.com/oMe3Qp) - bu tam olarak x 'değiştiricisinin ne için olduğunu. – Jan

3

Bu regex

^\w{3,}-\w{3,}$ 

^  // start of the string 
\w{3,} // match "a" to "z", "A" to "Z" and 0 to 9 and requires at least 3 characters 
-  // requires "-" 
\w{3,} // same as above 
$  // end of the string 

Regex Demo

5

veya var olan herhangi bir başka mektup Unicode aralığı (Yunanca veya Kiril gibi olsun ters), daha sonra basamak Unicode harf (ve \d) eşleştirmek için UTF-8 desteği) ve \pL için (u değiştirici kullanmak:

$string =" 
Mañana-déjà 
Text-Text 
Abc-123 
123-Abc 
A2C-def4gk 
Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b%"; 

$regex='/^[\pL\d]{3,}-[\pL\d]{3,}$/mu'; 

preg_match_all($regex, $string, $matches); 

var_export($matches); 

Çıkış:

array (
    0 => 
    array (
    0 => 'Mañana-déjà', 
    1 => 'Text-Text', 
    2 => 'Abc-123', 
    3 => '123-Abc', 
    4 => 'A2C-def4gk', 
), 
) 

Not: \w farkı [\pL\d], bir alt çizgi ile eşleşmeyecek.

2

Ve kısa bir tane.

^([^\W_]{3,8})-(?1)$ 
  • [^\W_]short for alnum olarak kullanılabilir. Bu \w
  • (?1) gelen çizgi çıkarır en bariz ve performanslısı @ chris85 için

Demo at regex101

Oyumu ilk gruptaki desenine bir subroutine call olduğunu.

İlgili konular