我正在尝试使用正则表达式来清理/格式化某些输入,以进行混合的拉丁语/表意文字(中文/日文/韩文)全文搜索。
我在一个我再也找不到的论坛上找到了一个有人尝试清理拉丁/亚洲语言字符串的旧示例(完全归功于此代码的原作者)。
我无法完全理解函数的正则表达式部分,特别是为什么它似乎对数字 0、2 和 3 的处理方式与其他基于拉丁文的数字 1,4-9 不同(基本上它处理数字 0、 4-9 正确,但查询中的数字 0,2-3 被视为亚洲字符)。
例如。我正在尝试清理以下字符串:
“hello 1234567890 蓄积した abc123def”
它会变成:
“hello 1 456789 abc1 def 2 3 0 蓄积した 2 3”
此净化字符串的正确输出应为:
“hello 1234567890 蓄积した abc123def”
如您所见,它正确地隔开亚洲字符,但数字 0、2、3 的处理方式与所有其他数字不同。关于为什么正则表达式以不同方式处理这些数字 0,2 和 3 的任何帮助将是一个很大的帮助(或者如果您知道实现类似结果的更好方法)!谢谢
我已经包含了下面的功能
函数准备字符串($str){
$str = mb_strtolower(trim(preg_replace('#[^\p{L}\p{Nd}\.]+#u', ' ', $str)));
return trim(preg_replace('#\s\s+#u', ' ', preg_replace('#([^\12544-\65519])#u', ' ', $str) . ' ' . implode(' ' , preg_split('#([\12544-\65519\s])?#u', $str, -1, PREG_SPLIT_NO_EMPTY))));
}
更新:为清楚起见提供上下文
我正在创作一个将在中国推出的网站。该网站将具有搜索功能,我正在尝试为搜索查询输入编写解析器。
与英语使用“ ”作为句子中单词之间的分隔符不同,中文不使用单词之间的空格。因此,我必须通过拆分每个汉字并在数据库中单独搜索每个字符来重新格式化搜索查询。中国用户还将使用拉丁/英文字符来表示品牌名称等他们可以与他们的中文字符混合在一起的东西(例如,Ivy新闻铺)。
我想做的是将所有英文单词与汉字分开,并用空格分隔每个汉字。
搜索查询可能如下所示:Ivy 铺</p>
我想解析它,使它看起来像这样:Ivy 牛仔铺</p>