Sto cercando qualcosa di simile a preg_quote, ma per la sintassi regexp di MySQL.Funzione PHP per sfuggire alla sintassi regexp di MySQL
Qualche idea?
Sto cercando qualcosa di simile a preg_quote, ma per la sintassi regexp di MySQL.Funzione PHP per sfuggire alla sintassi regexp di MySQL
Qualche idea?
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_string
dopo che citando, per fermare le barre inverse di essere male interpretato come stringa non standard ANSI fughe letterali di MySQL.)
Non esiste una funzione nativa MySQL per questo. Potrebbe essere sufficiente utilizzare preg_quote
prima di passare l'espressione regolare alla query MySQL.
Purtroppo, preg_quote()
pasticci di PHP su MySQL REGEXP da sfuggire un segno due punti (:) che REGEXP di MySQL non capisce
Quindi, l'approccio migliore per preg_quote è quindi di sostituire tutti i due punti con caratteri in sequenza senza punti di escape? –
Prova questa: (PHP)
$tags="test'*\\\r blue";
$tags=mysql_real_escape_string($tags);
$tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
$tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);
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.
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
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
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)! –