PHP正则表达式去掉所有表情符号

4
我试图使用正则表达式从一个字符串中去除所有非允许字符。这是我当前的php代码。
$input = "";

$pattern = "[a-zA-Z0-9_ !@#$%^&*();\\\/|<>\"'+\-.,:?=]";
$message = preg_replace($pattern,"",$input);

if (empty($message)) {
    echo "The string is empty";
}
else {
    echo $message;
}

当我运行这段代码时,表情符号被打印出来了,但我希望它打印出“字符串为空”。当我把我的正则表达式代码放到http://regexr.com/中时,它显示表情符号不匹配,但当我运行代码时,它会被打印出来。有什么建议吗?
2个回答

8

这个模式应该可以解决问题:

$filteredString = preg_replace('/([^-\p{L}\x00-\x7F]+)/u', '', $rawString);

有些序列非常罕见,因此我们来解释一下它们:

  • \p{L} 匹配任何语言的任何字母
  • \x00-\x7F 单个字符范围在(index 0)到(index 127)之间(区分大小写)
  • u 修饰符打开了PCRE的附加功能,与Perl不兼容。 模式和主题字符串被视为UTF-8。

4

您的模式不正确。如果您想剥离所有不在提供列表中的字符,则必须使用否定字符类:[^...]。此外,目前正在使用[]作为分隔符,这意味着该模式不被视为字符类。

正确的模式应该是:

$pattern = "~[^a-zA-Z0-9_ !@#$%^&*();\\\/|<>\"'+.,:?=-]~";

这应该现在去掉表情符号并打印您的消息。

$pattern = "[^!-]~";它更简单且具有相同的目的。我们可以在正则表达式中使用不同于通常的a-z0-9的范围。 - yeyo
@yeyo:如果题主想要删除非字母、数字或集合内字符的字符串怎么办?请注意,不应该在字符类中间使用“-”。你的正则表达式应该是[^!〜-][^-!~] - Amal Murali
1
不好意思,你误解了我的评论,-应该放在中间。[^!-~]匹配任何不属于ASCII范围的单个字符 !~。换句话说,[^!-~]等同于表达式[^a-zA-Z0-9_ !@#$%^&*();\\\/|<>\"'+.,:?=-]。试试吧 :) - yeyo
这些解决方案去除了重音符号(例如:é),这对许多非英语语言来说是有问题的。 - Bruno
@Bruno 我同意。不过你应该能够找到更好的匹配表情符号的解决方案。 - Amal Murali
我刚刚在下面发布了我们如何做到的回复。 - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接