2011-10-05 34 views
45

mam ten kod:Separator nie musi być alfanumeryczny lub odwrotny ukośnik i 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]; 

i kiedy uruchomić im zwraca ten błąd:

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

+0

Jako notatkę, które mogą być pomocne dla innych, jeśli przechodzą wszystkie swoje argumenty 'preg_match()' jako zmienne, upewnij się, że nie dostać kolejność zmiennych przypadkowo zmieszanych w górę wywołanie funkcji, ponieważ prawie na pewno spowoduje to pojawienie się tego samego błędu. – bluebinary

Odpowiedz

86

Ty potrzebujesz ogranicznik dla wzorca. Należy dodać, na początku i na końcu wzorca tak:

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

To powinna być poprawna odpowiedź. –

1

Spróbuj z tym

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

Dlaczego warto unikać nawiasów? –

18

Musisz podać ogranicznik dla swojej wypowiedzi. Separator to znak specjalny używany na początku i końcu twojego wyrażenia, aby wskazać, która część jest wyrażeniem. Pozwala to na użycie modyfikatorów i interpretera, aby wiedzieć, który jest wyrażeniem i które są modyfikatorami. Jak informuje komunikat o błędzie, ogranicznik nie może być odwróconym ukośnikiem, ponieważ odwrotny ukośnik jest znakiem escape.

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

i poniżej tego samego przykładu, ale z modyfikatorem i dopasować bez litery.

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

Jak widać, i jest poza ukośniki i dlatego jest interpretowany jako modyfikator.

Należy również pamiętać, że jeśli użyjesz kreski ukośnika (/) jako separatora, musisz uciec od dalszych zastosowań wyrażenia regularnego, jeśli istnieje.

29

Rozwiązaniem (które inne odpowiedzi nie wspominają o — przynajmniej w momencie mojego oryginalnego pisania) jest to, że gdy PHP odnosi się do ograniczników, to nie odnosi się do ograniczników widocznych w kodzie (które są cudzysłowami), ale kolejne znaki w ciągu znaków. (W rzeczywistości nigdy nie widziałem tego nigdzie stwierdził w jakiejkolwiek dokumentacji. Trzeba zobaczyć go w przykładach) Więc zamiast zwykłej składni wyrażeń takich jak to, co może być przyzwyczajony do wielu innych językach:

/something/ 

PHP używa strun, a następnie wygląda wewnątrz napisu na inny ogranicznika:

'/something/' 

separator PHP odnosi się to parę / znaków, zamiast pary ' znaków. Więc jeśli napiszesz 'something', PHP przyjmie s jako zamierzony separator i narzeka, że ​​nie możesz używać znaków alfanumerycznych jako ogranicznika.

Więc jeśli chcesz przekazać (na przykład) jest i, aby pokazać, że chcesz case-insensitve mecz, przekazać go wewnątrz łańcucha, ale poza regex ograniczników:

'/something/i' 

Jeśli chcesz użyć czegoś innego niż / jako separatora, można, na przykład, jeśli jesteś pasujące URL i nie chcą mieć do ucieczki wszystkie ukośniki:

'~something~' 
+1

nie może przejąć tego wystarczająco dużo razy! – Gruber

+0

@Gruber: dzięki! zawsze możesz wysłać do niego wszystkie linki znajomych i pozwolić im je odczytać;) – iconoclast

+0

Wyjaśnienie, czego dokumentacja nie wyjaśnia .. +1 Dziękujemy! –

5

wzór musi mieć ograniczniki. Elementami ograniczającymi mogą być ukośnik (/) lub dowolne znaki niealfanumeryczne (#, $, *, ...). Przykłady

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#"; 
$pattern = "@My name is '(.*)' and im [email protected]"; 
Powiązane problemy