2016-02-27 8 views
7

Ho studiato un po ', ma non ho trovato nulla che si riferisca esattamente a ciò di cui ho bisogno e ogni volta che ho cercato di creare l'espressione è sempre un po' fuori da quello che richiedo.Le espressioni regolari, consentono solo il formato specfico. "John-doe"

Ho tentato qualcosa sulla falsariga di [AZaz09]{3,8}\-[AZaz09]{3,8}.

Desidero che il risultato valido consenta solo testo di testo, dove o il testo può essere alfabetico o numerico, tuttavia l'unico simbolo consentito è - e questo è tra i due testi.

Ogni testo deve contenere almeno tre caratteri ({3,8}?), Quindi separati da -.

Pertanto per essere valida alcuni esempi potrebbero essere:

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

test non validi potrebbero essere:

Ab-3 
Abc!-ajr4 
a-bc3-25aj 
a?c-b% 
+1

Desidera che corrispondano anche lettere accentate o altri alfabeti? Come "déjà-vus", "12μ-13μ", "mañana-1234" – trincot

+0

@trincot: buon punto, ho aggiornato la mia risposta per riflettere il modificatore 'u'. – Jan

risposta

10

È necessario utilizzare tasselli e utilizzare i - così i caratteri nella classe di caratteri sono letti come un intervallo, non i singoli caratteri.

Prova:

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

Demo: https://regex101.com/r/xH3oM8/1

È inoltre possibile semplificare una ma con il modificatore di i e il meta carattere \d.

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

Il primo sembra perfetto per il mio uso :) – mhvvzmak1

+0

Ho notato che nel sito c'è/gm alla fine della regex, cosa fa questo gm ed è richiesto? – mhvvzmak1

+2

'g' è un modificatore globale,' m' è multilinea. Questo è solo per dimostrare lì. 'G' non è supportato in PHP. Il 'm' rende'^$ 'corrisponde a ogni riga, piuttosto che all'intera stringa. – chris85

4

Si potrebbe venire con il seguente:

<?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); 
?> 

Come @ chris85 sottolineato, \w corrisponderà una sottolineatura pure. Trincot ha avuto un buon commento (corrispondenti caratteri accentati, cioè). Per ottenere ciò, simply use the u modifier.
Vedere a demo on regex101.com e a complete code on ideone.com.

+0

Il PHP non funzionerà con la spiegazione in là, dovresti farlo nel corpo della domanda da solo. – chris85

+0

@ chris85, forse controlla il modificatore 'x' ... – trincot

+0

@ chris85: [Perché non ???] (http://ideone.com/oMe3Qp) - questo è esattamente ciò che il modificatore' x' è per. – Jan

3

È possibile utilizzare questa espressione regolare

^\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

Se le lettere accentate dovrebbe essere consentito, o di qualsiasi altra lettera che esiste nel Intervallo Unicode (come greco o cirillico let TERS), quindi utilizzare il modificatore u (UTF-8) e \pL per abbinare lettere Unicode (e \d per cifre):

$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); 

uscita:

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

NB: la differenza con \w è che [\pL\d] non corrisponderà a un carattere di sottolineatura.

2

E uno corto.

^([^\W_]{3,8})-(?1)$ 

Demo at regex101

Il mio voto per @ chris85, che è più evidente e performante.