2011-10-05 14 views
45

ho questo codice:delimitatore non deve essere alfanumerico o barra rovesciata e funzione preg_match

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches); 
echo $matches[1]; 

e quando im eseguirlo restituisce questo errore:

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+0

Come nota che può essere utile agli altri, se si passa tutti i vostri argomenti per 'preg_match()' come variabili, assicurarsi che non si ottiene l'ordine delle variabili accidentalmente mescolati nel chiamata di funzione poichè questo quasi certamente porterà allo stesso errore che appare. – bluebinary

risposta

86

Hai bisogno di un delimitatore per il vostro modello. Va aggiunto all'inizio e alla fine del modello in questo modo:

$pattern = "/My name is '(.*)' and im fine/"; // With/as a delimeter 
+1

Questa dovrebbe essere la risposta corretta. –

1

Si prega di provare con questo

$pattern = "/My name is '\(.*\)' and im fine/"; 
+0

Perché sfuggire le parentesi? –

18

È necessario specificare un delimitatore per la vostra espressione. Un delimitatore è un carattere speciale utilizzato all'inizio e alla fine dell'espressione per indicare quale parte è l'espressione. Questo ti permette di usare i modificatori e l'interprete per sapere quale è un'espressione e quali sono i modificatori. Come indica il messaggio di errore, il delimitatore non può essere una barra rovesciata perché la barra rovesciata è il carattere di escape.

$pattern = "/My name is '(.*)' and im fine/"; 

e sotto lo stesso esempio, ma con il modificatore i per abbinare senza essere minuscole.

$pattern = "/My name is '(.*)' and im fine/i"; 

Come si può vedere, la i è al di fuori delle barre e quindi viene interpretato come modificatore.

Inoltre, tenere presente che se si utilizza un carattere di barra (/) come delimitatore, è necessario sfuggire a ulteriori usi di/nell'espressione regolare, se presente.

29

La soluzione (che altre risposte non menzionano — almeno al momento della mia scrittura originale) è che quando PHP fa riferimento ai delimitatori, non si riferisce ai delimitatori che vedi nel tuo codice (che sono virgolette) ma i successivi caratteri all'interno della stringa. (In realtà non ho mai visto questo indicato da nessuna parte in alcuna documentazione:. Bisogna vederlo in esempi) Così, invece di avere una sintassi delle espressioni regolari come quello che si può essere abituati a da molte altre lingue:

/something/ 

PHP utilizza stringhe, e poi guarda dentro la stringa per un'altra delimitatore:

'/something/' 

il delimitatore di PHP si riferisce è la coppia di / personaggi, invece della coppia di ' caratteri. Quindi, se scrivi 'something', PHP prenderà il s come delimitatore previsto e si lamenterà che non ti è permesso usare caratteri alfanumerici come delimitatori.

Quindi, se si desidera passare (per esempio) un i per dimostrare che si vuole una partita insensitve caso, si passa all'interno della stringa, ma al di fuori dei delimitatori regex:

'/something/i' 

Se si desidera usare qualcosa di diverso / come delimitatore, è possibile, come ad esempio se si sta corrispondenza di un URL e non vogliono avere per sfuggire tutte le barre:

'~something~' 
+1

non può sopravvalutare questo abbastanza volte! – Gruber

+0

@Gruber: grazie! puoi sempre inviare a tutti i tuoi amici i link e lasciarli sviare;) – iconoclast

+0

Spiegare quale documentazione non spiega .. +1 Grazie! –

5

Il modello deve avere delimitatori. I delimitatori possono essere una barra (/) o qualsiasi carattere non alfanumerico (#, $, *, ...). Esempi

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#"; 
$pattern = "@My name is '(.*)' and im [email protected]"; 
Problemi correlati