20

通过互联网和这个网站搜索,我发现了几个关于这个问题的主题。问题是,如果插入的字符串必须仅包含拉丁字母的字符,则有无数的解决方案,但是当案例需要其他字母的文本时,它会变得有点棘手。

有什么方法可以在 PHP 中去除字符串中的所有符号,但保留所有 UTF-8 字母表的实际字母?我已经尝试创建一个包含键盘所有字符的数组,然后使用 str_replace 或 preg_replace 删除它们,但后来我发现不同的国家有时也有不同的键盘,其中包含不同的符号。例如,我的 qwerty 键盘没有£英式键盘可能有的符号。

我知道这是一个奇怪的问题,我只是想知道是否有一个我可能错过的简单解决方案。

任何帮助将不胜感激!

编辑: 好的经过一些更好和扩展的谷歌搜索后,我发现以下正则表达式可以很好地满足我的需要,它保留了所有类型的字母表的所有字母,同时删除了所有符号。我在这里分享它以防其他人需要这样做。

$string = preg_replace('/[^\p{L}\p{N}\s]/u', '', $string);

4

5 回答 5

45

解决方案是这样的: $string = preg_replace('/[^\p{L}\p{N}\s]/u', '', $string);

于 2013-05-28T12:17:45.870 回答
24
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.

$string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.

echo $string; // output will be abcdef-g for 'a|"bc!@£de^&$f g'
于 2013-05-24T11:21:31.023 回答
1

可以检查 unicode 字符和数字,但前提是 PCRE 是用
--enable-unicode-properties. 如果是这种情况,那么您可以使用\p{Nl}匹配 unicode 字母和数字的正则表达式。更多关于 PHP 中 unicode 正则表达式的信息可以在文档中找到

编辑: 编辑问题后

要使用符号\P而不是\p再次查看我上面链接到的 PHP 文档。

于 2013-05-24T11:40:16.260 回答
1

尝试这个:

<?php

$string = "Remove these characters: £äó";
$string = preg_replace('/[^(\x20-\x7F)]*/','', $string);
echo $string;
?>
于 2013-05-24T11:16:07.867 回答
1

根据其他答案,为您允许的字符构建正则表达式(例如,从您支持的每个字母表中,并删除其他字符。这是一个Unicode 块范围列表,用于获取每种语言的字符值/范围 - 这就是您需要自己编译。

于 2013-05-24T11:36:36.980 回答