Mam ten kod:
$string1 = "My name is 'Kate' and im fine";
$pattern = "My name is '(.*)' and im fine";
preg_match($pattern , $string1, $matches);
echo $matches[1];
a kiedy uruchamiam, zwraca ten błąd:
Ostrzeżenie: preg_match () [function.preg-match]: separator nie może zawierać znaków alfanumerycznych ani ukośnika odwrotnego
php
regex
preg-match
user547363
źródło
źródło
preg_match()
jako zmienne, upewnij się, że kolejność zmiennych nie została przypadkowo pomieszana w wywołaniu funkcji, ponieważ prawie na pewno spowoduje to to samo pojawia się błąd.$pattern = "/My name is '(.*)' and im fine/";
Odpowiedzi:
Potrzebujesz separatora dla swojego wzoru. Należy dodać na początku i na końcu wzoru w następujący sposób:
$pattern = "/My name is '(.*)' and im fine/"; // With / as a delimeter
źródło
\l
do nowego wiersza) zostaną przekonwertowane na ich znak, co może dać inne wyrażenie niż oczekiwano. Użyj apostrofów. Zobacz opis ciągów php .\'
który byłby wymagany, gdyby był ujęty w pojedyncze cudzysłowy).Rozwiązanie (o którym inne odpowiedzi nie wspominają - przynajmniej w czasie, kiedy to pisałem) jest takie, że kiedy PHP odnosi się do ograniczników, nie odnosi się do ograniczników, które widzisz w kodzie (które są cudzysłowami), ale następny znaków w ciągu. (Właściwie nigdy nie widziałem tego nigdzie w żadnej dokumentacji: musisz to zobaczyć w przykładach). Zamiast więc mieć składnię wyrażeń regularnych, taką jak ta, do której możesz być przyzwyczajony w wielu innych językach:
PHP używa łańcuchów, a następnie szuka w nich innego separatora:
'/something/'
Separator, do którego odnosi się PHP, to para
/
znaków zamiast pary'
znaków. Więc jeśli piszesz'something'
, PHP weźmies
za zamierzony separator i narzeknie, że nie możesz używać znaków alfanumerycznych jako separatora.Więc jeśli chcesz przekazać (na przykład) an,
i
aby pokazać, że chcesz dopasować bez uwzględniania wielkości liter, przekazujesz go wewnątrz ciągu, ale poza ogranicznikami wyrażenia regularnego:'/something/i'
Jeśli chcesz użyć czegoś innego niż
/
jako separatora, możesz, na przykład, dopasować adres URL i nie chcesz uciekać przed wszystkimi ukośnikami:'~something~'
źródło
W wyrażeniu musisz określić separator. Separator to specjalny znak używany na początku i na końcu wyrażenia w celu wskazania, która część jest wyrażeniem. Dzięki temu możesz używać modyfikatorów i interpretera, aby wiedzieć, które jest wyrażeniem, a które modyfikatorami. Jak stwierdza komunikat o błędzie, separatorem nie może być ukośnik odwrotny, ponieważ ukośnik odwrotny jest znakiem zmiany znaczenia.
$pattern = "/My name is '(.*)' and im fine/";
a poniżej ten sam przykład, ale z
i
modyfikatorem do dopasowania bez rozróżniania wielkości liter.$pattern = "/My name is '(.*)' and im fine/i";
Jak widać,
i
znak znajduje się poza ukośnikami i dlatego jest interpretowany jako modyfikator.Pamiętaj również, że jeśli używasz znaku ukośnika (/) jako separatora, musisz następnie pominąć dalsze użycie / w wyrażeniu regularnym, jeśli występuje.
źródło
Wzorzec musi mieć ograniczniki. Ograniczniki mogą być ukośnikiem (/) lub dowolnymi znakami innymi niż alfanumeryczne (#, $, *, ...). Przykłady
$pattern = "/My name is '(.*)' and im fine/"; $pattern = "#My name is '(.*)' and im fine#"; $pattern = "@My name is '(.*)' and im fine@";
źródło
Możesz również skorzystać z biblioteki T-Regx, która ma automatyczne separatory :
$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all(); // ↑ No delimiters needed
źródło
Może nie jest to związane z oryginalnym przykładem kodu, ale otrzymałem błąd „Separator nie może być alfanumeryczny ani ukośnikiem odwrotnym” i wpisałem go w Google. Powód: pomieszałem kolejność parametrów dla preg_match. Wzorzec był drugim parametrem, a pasujący ciąg był pierwszym. Bądź ostrożny :)
źródło
Spróbuj z tym
$pattern = "/My name is '\(.*\)' and im fine/";
źródło