回答
MySQL正則表達式是'extended'POSIX變體(ERE),在PHP中作爲已棄用的ereg_
函數提供。
不幸的是,PHP中沒有ereg_quote
,但是PCRE的特殊字符的ERE的特殊字符的超集,反斜槓逃逸的非特殊標點符號不會傷害它,所以你可以使用preg_quote
逃脫安全。
(當然,你需要參數化查詢或即報價,之後mysql_real_escape_string
停止反斜槓被誤解爲MySQL的非ANSI標準的字符串字面逃逸。)
這裏沒有原生的MySQL函數。在將正則表達式傳遞給MySQL查詢之前,您可能只需要使用preg_quote
。
可悲的是,PHP的preg_quote()
弄亂了MySQL的REGEXP通過逃逸冒號符號(:)這MySQL的REGEXP不明白
那麼是preg_quote最好的方法,然後用未轉義的冒號替換所有的冒號冒號? – 2014-08-21 20:13:19
試試這個:(PHP)
$tags="test'*\\\r blue";
$tags=mysql_real_escape_string($tags);
$tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
$tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);
謝謝@bobince's good answer。但是,如果您需要在引用後使用mysql_real_escape_string
,則說明它存在問題,我在評論中提到了它。
其實preg_quote
和mysql_real_escape_string
有重疊,它使這個問題! mysql_real_escape_string
在這種情況下不能逃脫\
。因此,我建議:
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
}
(對於charlist
見:http://php.net/manual/en/mysqli.real-escape-string.php)
我知道這是不是一種理想的方式。但找不到更好的方法。
- 1. PHP preg_match_all語法/正則表達式
- 2. 正則表達式轉義方法
- 3. 正則表達式語法
- 4. php函數array_key_exists和正則表達式
- 5. 使用正則表達式來Smarty的語法轉換爲PHP語法
- 6. PHP德語貨幣正則表達式
- 7. 正則表達式所有語言PHP
- 8. MySQL的PHP的preg_replace,正則表達式
- 9. PHP-MySQLi替換爲正則表達式/正則表達式/正則表達式
- 10. C#正則表達式轉義序列
- 11. 正則表達式和轉義
- 12. 正則表達式用\或\\轉義?
- 13. 正則表達式和轉義序列
- 14. 轉義XSLT正則表達式
- 15. 轉義#在BRE正則表達式
- 16. 在SpEL中轉義正則表達式
- 17. 轉義部分正則表達式
- 18. 正則表達式轉義標籤鍵
- 19. 正則表達式轉義問題
- 20. 轉義字符正則表達式
- 21. 正則表達式關鍵字轉義
- 22. Java正則表達式轉義字符
- 23. php正則表達式:如何正確轉義字符?
- 24. 在PHP扭轉了正則表達式
- 25. PHP正則表達式輸出轉換
- 26. 轉換的Javascript正則表達式PHP
- 27. PHP自定義的正則表達式
- 28. php函數preg_replace正則表達式不工作,一個語法問題
- 29. PHP函數preg_replace與正則表達式不工作,一個語法問題
- 30. 如何將java正則表達式轉換爲mysql正則表達式
輕微的警告:空控制字符。 'preg_quote'將它轉義爲'\ 000',這是MySQL無法識別的格式。但是,MySQL的正則表達式引擎無論如何都無法應對空字符,它將它們當作終結符。 – bobince 2010-10-26 23:13:32
我不得不使用str_replace('?','\\?',preg_quote()),因爲preg_quote()可能產生?當它不知道特定的UTF8字符時。而且?需要在正則表達式中轉義。 – JochenJung 2014-09-20 07:41:52
有問題! 'mysql_real_escape_string'會轉義反斜槓字符。此功能會導致所有反斜槓再次轉義(如果您在引用後使用'mysql_real_escape_string')! – 2017-10-07 11:19:00