regexunicode - 使用preg_match_all时删除重音字符

时间:2012-05-05 17:15:35

标签: php regex unicode utf-8 preg-match-all

我有标题中描述的问题。 如果我使用

preg_match_all('/\pL+/u', $_POST['word'], $new_word);

我键入helloà和<<< em>返回的new_word是* hello和* 为什么呢?

有人建议我以这种方式指定我想转换的所有字符

preg_match_all('/\pL+/u', $_POST['word'], 'aäeëioöuáéíóú');

,但我希望我的应用程序适用于所有现有的重音符号(对于多语言网站)。 你能帮助我吗? 感谢。

编辑:我指定使用此正则表达式来净化标点符号。它很好地净化了所有标点符号,但unicode字符返回错误,实际上甚至没有返回。

编辑2:我很抱歉,但我解释得非常糟糕。 问题不在preg_match_all中,而在

str_word_count($my_key, 2, 'aäáàeëéèiíìoöóòuúù');

我不得不手动指定重音字符,但我认为还有很多其他字符。正确?

2 个答案:

答案 0 :(得分:3)

\pL应匹配所有utf8字符和空格。请确保$_POST['word']是使用utf8编码的字符串。如果没有,请在匹配之前尝试utf8_encode()或检查HTML表单的编码。在我的测试中,你的例子就像一个魅力。

您可以与count()一起使用以获取字数。那你就不必关心可能的角色了。 \pL会为您完成此操作。这应该可以解决问题:

$string = "áll thât words wíth ìntérnâtiønal çhårs";

preg_match_all('/\pL+/u', $string, $words);
echo count($words[0]); // returns: 6

答案 1 :(得分:0)

尝试使用Multibyte String PHP库中的mb_ereg_match()(而不是preg_match())。它专门用于处理多字节字符串。