Je cherche quelque chose de similaire à preg_quote, mais pour la syntaxe MySQL regexp.Fonction PHP pour échapper à la syntaxe MySQL regexp
Des idées?
Je cherche quelque chose de similaire à preg_quote, mais pour la syntaxe MySQL regexp.Fonction PHP pour échapper à la syntaxe MySQL regexp
Des idées?
Les expressions rationnelles MySQL sont la variante POSIX 'étendue' (ERE), disponible en PHP comme les fonctions ereg_
obsolètes.
Malheureusement il n'y a pas ereg_quote
en PHP, mais des caractères spéciaux de PCRE sont une surcouche de caractères spéciaux Ere, et antislash échapper à un caractère de ponctuation non spécial ne détruis pas, vous pouvez se contenter d'utiliser preg_quote
sans encombre.
(Bien entendu, vous aurez besoin des requêtes paramétrées ou mysql_real_escape_string
après qui cite, pour arrêter les antislashs être mal interprétés comme chaîne non-ANSI standard échappe littérale de MySQL.)
Il n'y a pas de fonction native MySQL pour ça. Vous devrez juste utiliser preg_quote
avant de passer l'expression régulière à la requête MySQL.
Malheureusement, preg_quote()
mess de PHP de MySQL RegExp échapper à un signe deux-points (:) qui le REGEXP de MySQL ne comprend pas
Donc, est-ce la meilleure approche de preg_quote, puis remplacez tous les deux-points échappés par des deux-points non échappés? –
Essayez ceci: (PHP)
$tags="test'*\\\r blue";
$tags=mysql_real_escape_string($tags);
$tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
$tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);
Remerciez @bobince's good answer. Mais il y a un problème si vous devez utiliser mysql_real_escape_string
après avoir cité, que je l'ai mentionné dans un commentaire.
En fait preg_quote
et mysql_real_escape_string
ont des chevauchements et il fait de ce problème! mysql_real_escape_string
ne doit pas échapper \
dans ce cas. Je suggère donc:
function regexpEscape(/*string*/ $input) // Can uncomment `string` for PHP 7.0+
{
return addcslashes(preg_quote($input), "\0'\"\n\r\x1A"); // charlist = All characters that escape by real_escape_string except backslash
}
(Pour voir charlist
: http://php.net/manual/en/mysqli.real-escape-string.php)
je sais que ce n'est pas un moyen idéal. Mais ne pouvait pas trouver un meilleur moyen.
Légère mise en garde: le caractère de contrôle nul. 'preg_quote' échappe à' \ 000', un format que MySQL ne reconnaît pas. Mais alors le moteur de regex de MySQL ne peut pas faire face aux caractères NULL de toute façon, il les prend comme des terminateurs. – bobince
Je devais utiliser str_replace ('?', '\\?', Preg_quote()), puisque preg_quote() pouvait produire? quand il ne connaît pas les caractères UTF8 spécifiques. Et ? doit être échappé dans l'expression rationnelle. – JochenJung
Un problème! 'mysql_real_escape_string' va échapper les caractères antislash. Cette fonctionnalité provoque l'échappement de toutes les barres obliques inverses (si vous utilisez 'mysql_real_escape_string' après la citation)! –