Il delimitatore non deve essere alfanumerico o backslash e preg_match


88

Ho questo codice:

$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 corro restituisce questo errore:

Avviso: preg_match () [function.preg-match]: il delimitatore non deve essere alfanumerico o barra rovesciata


2
Come nota che può essere utile ad altri, se stai passando tutti i tuoi argomenti a preg_match()come variabili, assicurati di non ottenere l'ordine delle variabili accidentalmente confuso nella chiamata di funzione poiché questo quasi certamente risulterà anche in questo stesso errore visualizzato.
bluebinary

1
Hai bisogno di un delimitatore nella tua stringa regexp
Ki Jéy

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

Risposte:


134

Hai bisogno di un delimitatore per il tuo modello. Dovrebbe essere aggiunto all'inizio e alla fine del motivo in questo modo:

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

1
Fai attenzione a usare le virgolette doppie per racchiudere le espressioni regex, altrimenti alcune combinazioni di caratteri \ + (come l' \lavanzamento riga) verranno convertite nel loro carattere, il che potrebbe produrre un'espressione diversa da quella prevista. Usa virgolette singole. Vedere la descrizione delle stringhe php .
Patanjali

In questo esempio la stringa include virgolette singole, quindi è più semplice utilizzare virgolette doppie per racchiuderla (evitando l'escape \'che sarebbe richiesta se fosse racchiusa tra virgolette singole).
Paul

Stavo facendo un commento generale, poiché le persone che guardano gli esempi potrebbero prenderli come qualcosa da "tagliare i biscotti" per se stessi, senza rendersi conto delle conseguenze impreviste che potrebbero accadere se lo estendono ad altre situazioni. Sfortunatamente, non posso modificare il mio commento per essere ancora più specifico.
Patanjali

68

La soluzione (che altre risposte non menzionano, almeno al momento in cui ho scritto originariamente questo) è che quando PHP si riferisce ai delimitatori, non si riferisce ai delimitatori che vedi nel tuo codice (che sono virgolette) ma il prossimo caratteri all'interno della stringa. (In effetti non l'ho mai visto affermato da nessuna parte in nessuna documentazione: devi vederlo negli esempi.) Quindi, invece di avere una sintassi di espressioni regolari come quella a cui potresti essere abituato da molte altre lingue:

/something/

PHP utilizza le stringhe e quindi cerca all'interno della stringa un altro delimitatore:

'/something/'

Il delimitatore a cui si riferisce PHP è la coppia di /caratteri, anziché la coppia di 'caratteri. Quindi, se scrivi 'something', PHP prenderà scome delimitatore previsto e si lamenterà del fatto che non ti è permesso utilizzare caratteri alfanumerici come delimitatore.

Quindi, se vuoi passare (ad esempio) un iper mostrare che vuoi una corrispondenza senza maiuscole e minuscole, lo passi all'interno della stringa ma al di fuori dei delimitatori regex:

'/something/i'

Se vuoi usare qualcosa di diverso da /come delimitatore, puoi farlo, ad esempio se stai abbinando un URL e non vuoi dover sfuggire a tutte le barre:

'~something~'

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

1
Spiegare quale documentazione non spiega .. +1 Grazie!
Ju Oliveira

La risposta votata più in alto è la stessa di questa, tuttavia, sono grato di capire ora perché questa è la risposta corretta. +1 Grazie!
Eclettico

21

Devi specificare un delimitatore per la tua espressione. Un delimitatore è un carattere speciale utilizzato all'inizio e alla fine dell'espressione per indicare quale parte è l'espressione. Ciò consente di utilizzare 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 imodificatore per trovare la corrispondenza senza distinzione tra maiuscole e minuscole.

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

Come puoi vedere, iè al di fuori delle barre e quindi viene interpretato come un modificatore.

Inoltre, tieni presente che se usi un carattere barra (/) come delimitatore devi quindi sfuggire a ulteriori usi di / nell'espressione regolare, se presente.


7

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 fine@";  


0

Forse non correlato all'esempio di codice originale, ma ho ricevuto l'errore "Il delimitatore non deve essere alfanumerico o barra rovesciata" e ho cercato su Google qui. Motivo: ho mescolato l'ordine dei parametri per preg_match. Pattern era il secondo parametro e la stringa da abbinare era la prima. Stai attento :)


-2

Per favore prova con questo

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

Perché sfuggire alle parentesi?
Ki Jéy

1
@kiJey. Nella situazione dell'OP, volevano estrarre il nome, quindi le parentesi sono necessarie per la corrispondenza, e quindi NON devono essere evitate. Questo è il motivo per cui lo sto downvoting.
Patanjali
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.