2010-11-02 220 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