2010-11-02 127 views
1

我想允許A-Z,a-z和日文漢字,平假名和片假名,而不是別的。 到目前爲止,我想出了這一點:正則表達式過濾日語

$pattern = '/[^\w\x{3041}-\x{3094}\x{30A1}-\x{30fA}\x{30fC}\x{4E00}-\x{9FFF}_\-]+/u'; 
preg_replace($pattern, '', $string); 

我不知道,如果這種形式的正則表達式是PHP特有的。我接受網址中的字符串,並希望過濾掉引號和其他「危險」字符。關於上述「模式」的奇怪之處在於,有或沒有「d」時,數字不匹配。

所以下面做同樣的事情:

$pattern = '/[^\d\w\x{3041}-\x{3094}\x{30A1}-\x{30fA}\x{30fC}\x{4E00}-\x{9FFF}_\-]+/u'; 

我感興趣的任何改進或更正 - 不是一個正則表達式嚮導自己。

+0

將危險字符加入黑名單並搜索它們可能會更容易。 – Thilo 2010-11-02 08:44:04

+0

我不知道什麼字符可能是危險的。有關於此的任何信息?我在MySQL where子句中使用這個字符串。所以它確實需要100%消毒。 – 2010-11-02 11:23:25

+0

是否可以使用準備(例如[mysqli](http://php.net/manual/en/class.mysqli-stmt.php))?這通常會更安全。 – 2010-11-02 16:22:05

回答

1

\w包括數字;它相當於[A-Za-z0-9_]。所以無論你如何允許他們。

+0

所以「d」只是[0-9],「w」是[A-Za-z0-9_]? – 2010-11-02 11:21:55

+0

@sims,這是正確的。你可能會發現這個[字符類列表](http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes)有幫助。 – 2010-11-02 16:20:30

+0

我正在使用http://www.regular-expressions.info/reference.html顯然它不清楚。感謝您的澄清! – 2010-11-03 00:44:14

3

在Unicode中,

x3040-x308f:平假名包括幾個老字符。 x30a1-x30ff:片假名。包括幾個符號。

但是,x4e00-x9eff分配給CJK字符集。不是日語。

CJK指中國,日本和韓國。

您可以用unicode來描述CJK字符區域。但是你不能用unicode來描述日文漢字區域。因爲在CJK代碼區,中國漢字和日本漢字混合在一起。不完全分開。中國和日本漢字共享一些字符。但是由於各方自身的發展,大部分字符都是不同的。

請參閱以下站點。它很重。你的電腦應該有足夠的字體來閱讀它。 http://www.tamasoft.co.jp/en/general-info/unicode.html

+0

感謝有關此信息。我特別擔心我正在過濾正確的字符。 – 2010-11-08 02:30:13