Eu tenho este código:
$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 sou executado, ele retorna este erro:
Aviso: preg_match () [function.preg-match]: O delimitador não deve ser alfanumérico ou barra invertida
php
regex
preg-match
user547363
fonte
fonte
preg_match()
como variáveis, certifique-se de não misturar a ordem das variáveis acidentalmente na chamada de função, pois isso quase certamente resultará no mesmo erro aparecendo.$pattern = "/My name is '(.*)' and im fine/";
Respostas:
Você precisa de um delimitador para seu padrão. Deve ser adicionado no início e no final do padrão, assim:
$pattern = "/My name is '(.*)' and im fine/"; // With / as a delimeter
fonte
\l
para alimentação de linha) serão convertidas em seus caracteres, o que pode muito bem produzir uma expressão diferente do esperado. Use aspas simples. Veja a descrição de php Strings .\'
que seria necessário se estivesse entre aspas simples).A solução (que outras respostas não mencionam - pelo menos no momento em que escrevi isso originalmente) é que quando PHP se refere a delimitadores, não está se referindo aos delimitadores que você vê em seu código (que são aspas), mas o próximo caracteres dentro da string. (Na verdade, nunca vi isso declarado em nenhuma documentação: você tem que ver em exemplos.) Então, em vez de ter uma sintaxe de expressão regular como a que você está acostumado em muitas outras linguagens:
O PHP usa strings e, em seguida, procura outro delimitador dentro da string :
'/something/'
O delimitador ao qual o PHP está se referindo é o par de
/
caracteres, ao invés do par de'
caracteres. Portanto, se você escrever'something'
, o PHP tomarás
como delimitador pretendido e reclamará que você não tem permissão para usar caracteres alfanuméricos como delimitador.Portanto, se você quiser passar (por exemplo) um
i
para mostrar que deseja uma correspondência não sensível a maiúsculas e minúsculas, passe-o dentro da string, mas fora dos delimitadores regex:'/something/i'
Se quiser usar algo diferente de
/
seu delimitador, você pode, por exemplo, se estiver correspondendo a um URL e não quiser ter que escapar todas as barras:'~something~'
fonte
Você deve especificar um delimitador para sua expressão. Um delimitador é um caractere especial usado no início e no final de sua expressão para denotar qual parte é a expressão. Isso permite que você use modificadores e o interpretador para saber o que é uma expressão e quais são os modificadores. Como afirma a mensagem de erro, o delimitador não pode ser uma barra invertida porque a barra invertida é o caractere de escape.
$pattern = "/My name is '(.*)' and im fine/";
e abaixo do mesmo exemplo, mas com o
i
modificador para corresponder sem diferenciar maiúsculas de minúsculas.$pattern = "/My name is '(.*)' and im fine/i";
Como você pode ver, o
i
está fora das barras e, portanto, é interpretado como um modificador.Também tenha em mente que se você usar um caractere de barra (/) como um delimitador, você deve escapar de outros usos de / na expressão regular, se houver.
fonte
O padrão deve ter delimitadores. Delimitadores podem ser uma barra (/) ou quaisquer caracteres não alfanuméricos (#, $, *, ...). Exemplos
$pattern = "/My name is '(.*)' and im fine/"; $pattern = "#My name is '(.*)' and im fine#"; $pattern = "@My name is '(.*)' and im fine@";
fonte
Você também pode usar a biblioteca T-Regx, que tem delimitadores automáticos para você:
$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all(); // ↑ No delimiters needed
fonte
Talvez não relacionado ao exemplo de código original, mas recebi o erro "O delimitador não deve ser alfanumérico ou barra invertida" e pesquisei aqui. Motivo: misturei a ordem dos parâmetros para preg_match. O padrão foi o segundo parâmetro e a string correspondente foi a primeira. Seja cuidadoso :)
fonte
Por favor tente com isto
$pattern = "/My name is '\(.*\)' and im fine/";
fonte