2010-10-26 19 views

risposta

9

Le regex di MySQL sono la variante POSIX "estesa" (ERE), disponibile in PHP come le funzioni deprecate ereg_.

purtroppo non c'è ereg_quote in PHP, tuttavia i caratteri speciali di PCRE sono un superset di caratteri speciali di ERE, e backslash-sfuggire un carattere non-speciale punteggiatura non nuocere, in modo da possibile farla franca usando preg_quote in modo sicuro.

(query Naturalmente avrete bisogno parametrizzati o mysql_real_escape_stringdopo che citando, per fermare le barre inverse di essere male interpretato come stringa non standard ANSI fughe letterali di MySQL.)

+2

Avviso minimo: il carattere di controllo null. 'preg_quote' lo sfugge a' \ 000', che è un formato che MySQL non riconosce. Ma poi il motore regex di MySQL non può comunque gestire caratteri null, li prende come terminatori. – bobince

+1

Ho dovuto usare str_replace ('?', '\\?', Preg_quote()), dal momento che preg_quote() potrebbe produrre? quando non conosce i caratteri UTF8 spettrali. E ? ha bisogno di essere sfuggito nella regexp. – JochenJung

+0

Un problema! 'mysql_real_escape_string' eviterà i caratteri di backslash. Questa funzione fa sì che tutti i backslash vengano nuovamente sottoposti a escape (se si usa 'mysql_real_escape_string' dopo aver quotato)! –

1

Non esiste una funzione nativa MySQL per questo. Potrebbe essere sufficiente utilizzare preg_quote prima di passare l'espressione regolare alla query MySQL.

6

Purtroppo, preg_quote() pasticci di PHP su MySQL REGEXP da sfuggire un segno due punti (:) che REGEXP di MySQL non capisce

+1

Quindi, l'approccio migliore per preg_quote è quindi di sostituire tutti i due punti con caratteri in sequenza senza punti di escape? –

1

Prova questa: (PHP)

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

Grazie 01.235.588,719 mila. Ma ha un problema se hai bisogno di usare mysql_real_escape_string dopo aver citato, che ho citato in un commento.

In realtà preg_quote e mysql_real_escape_string si sono sovrapposti e questo problema! mysql_real_escape_string non deve sfuggire a \ in questo caso. Quindi suggerisco:

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 
} 

(Per charlist vedi: http://php.net/manual/en/mysqli.real-escape-string.php)

So che questo non è un modo ideale. Ma non riusciva a trovare un modo migliore.