2010-10-26 19 views

Répondre

9

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_stringaprès qui cite, pour arrêter les antislashs être mal interprétés comme chaîne non-ANSI standard échappe littérale de MySQL.)

+2

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

+1

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

+0

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)! –

1

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.

6

Malheureusement, preg_quote() mess de PHP de MySQL RegExp échapper à un signe deux-points (:) qui le REGEXP de MySQL ne comprend pas

+1

Donc, est-ce la meilleure approche de preg_quote, puis remplacez tous les deux-points échappés par des deux-points non échappés? –

1

Essayez ceci: (PHP)

$tags="test'*\\\r blue"; 
    $tags=mysql_real_escape_string($tags); 
    $tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags); 
    $tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags); 
0

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.