检测错误的书面变音符号

时间:2017-06-21 12:36:28

标签: php preg-replace ascii

我们需要将CSV文件导入包含错误书面变音符号的MySQL。

例如:使用非德语键盘的人输入Ü(ASCII 85)而不是U(ASCII 154),并使用ASCII 249添加了两个顶点,这看起来与他相同。 / p>

MySQL将此作为U?写入数据库。这就是为什么我们希望PHP检测非ASCII字符组合,例如可打印ASCII字符和扩展ASCII字符的组合,这在现实世界中是不存在的,至少在主要语言中不存在。

我们尝试过的preg_replace函数,不检测此函数或检测有效的变音符号。

preg_replace成功的机会还是其​​他方式?

3 个答案:

答案 0 :(得分:1)

由于您希望使用PHP代码来检测基本字母后跟一个或多个变音符号的任意组合,您可以使用

if (preg_match('~\p{L}\p{M}~u', $s, $m)) {
    echo "There is a multibyte char here: " . $m[0];
}

请注意:

  • \p{L} - 匹配任何Unicode字母
  • \p{M} - 匹配任何变音符号(组合标记)

u修饰符启用(*UTF)(*UCP) PCRE标志,使PCRE引擎以Unicode识别模式处理字符串和模式。

答案 1 :(得分:0)

这里有可能起作用的东西:

$contents = str_replace(chr(85).chr(249),chr(154), file_get_contents("mycsv.csv"));

然后执行建议的操作将数据库切换为UTF-8并执行:

$utfText = mb_convert_encoding($contents,"UTF-8","ISO-8859-1"); //I think that's the ISO standard you are referring to 

答案 2 :(得分:0)

Wiktor(第一条评论)将其钉死。

我们不需要更换,只是警告对我们来说没问题,因为这种罕见的情况应该在CSV文件中修复。

'~\p{L}\p{M}+~u'

完成这项工作。