2011-04-26 43 views
6

我的目标是通过抓取所有日语汉字和假名的Microsoft Word文档(.docx)进行过滤。 当前的代码,我有工作如下:涉及日语的PHP正则表达式

preg_match_all('~[\x{4e00}-\x{9faf}]([\x{3040}-\x{309f}]) \= ([a-z]) \=+~u', $data, $matches); 

根据一些研究,我发现日语文本的Unicode值如下:http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml

我与看起来像工作数据的例子这个:

时(とき)= toki =时间;小时;场合;时刻を= WO =粒子​​标记句子的直接对象(时=时间)超えて(こえて)= koete =交叉

我的最终目标是要能够运行preg_match_all以类似的取数据模式,看起来像“超えて(こえて)= koete” 之前的信息(以及之间的信息和后面的罗马化之间= =

我正在寻找的结果将返回数组,看起来如:

array(
    0 => array('時', 'とき', 'toki'), 
    1 => array('超えて', 'こえて', 'koete') 
); 

每个数组中的第一个结果在包含“汉字,平假名和可能的片假名”,而第二个结果仅为平假名,第三个结果仅为常规字母字符。我用正则表达式不太好,添加了Japaense unicode,我很无助,任何帮助都会真的被赞赏!谢谢!

回答

3

您可以使用特殊的Unicode正则表达式的占位符代替的数值范围,如果你使用/u修改:

preg_match_all('/ 
    ([\p{Han}\p{Katakana}\p{Hiragana}]+) # Kanji 
    (?: [(]         # optional part: paren (
    ([\p{Hiragana}]+)      # Hiragana 
    [)])?         # closing paren) 
    \s*=\s*         # spaces and = 
    ([\w\s;=]+)        # English letters 
    /ux', 
    $source, $matches, PREG_SET_ORDER 
); 
print_r($matches); 

我已经注意到了平假名在括号是可选的,所以我做了你的正则表达式多一点与(?: ...)?复杂,它可选择该部分。

注意,结果排序是有点不同,因为preg_match_all保持在指数完全匹配字符串[0]通常是:

[0] => Array 
    (
     [0] => 時(とき) = toki = time; hour; occasion; moment 
     [1] => 時 
     [2] => とき 
     [3] => toki = time; hour; occasion; moment 
    ) 
+0

感谢马里奥,这可以创造奇迹。 – 2011-04-27 01:04:41