从字符串中剥离所有非字母数字、空格和标点符号

25

我该如何使用PHP去除所有不是字母、数字、空格或标点符号的字符?

我尝试了以下代码,但它会去除标点符号。

preg_replace("/[^a-zA-Z0-9\s]/", "", $str);
4个回答

32
preg_replace("/[^a-zA-Z0-9\s\p{P}]/", "", $str);

示例:

php > echo preg_replace("/[^a-zA-Z0-9\s\p{P}]/", "", "⟺f✆oo☃. ba⟗r!");
foo. bar!

\p{P}匹配所有Unicode标点符号字符(请参见Unicode 字符属性)。如果您只想允许特定的标点符号,请将它们添加到否定字符类中。例如:

preg_replace("/[^a-zA-Z0-9\s.?!]/", "", $str);

第二个将不允许任何标点符号。第一个允许所有标点符号。 - Matthew Flaschen
这些看起来会去除所有字符 :( - Tedd
我正在使用您的第一个示例,但似乎它会剥离所有字符。我做错了什么? - Tedd
@Tedd,我不确定。 我发布了一个经过测试的示例。 文档提到了一些注意事项。您必须在PHP 4.4或5.1之后(取决于分支版本),使用UTF-8,且PCRE库必须使用--enable-unicode-properties编译。 - Matthew Flaschen

3

由于没有缩写符号表示标点符号(例如,\s 代表空格字符),您需要明确列出标点符号。

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

0
$str = trim($str);
$str = trim($str, "\x00..\x1F");
$str = str_replace(array( "&quot;","&#039;","&amp;","&lt;","&gt;"),' ',$str);
$str = preg_replace('/[^0-9a-zA-Z-]/', ' ', $str);
$str = preg_replace('/\s\s+/', ' ', $str); 
$str = trim($str);
$str = preg_replace('/[ ]/', '-', $str);

希望这能有所帮助。

这个答案缺少教育性的解释。看起来它正在实现一组不同的规则(不同于问题所要求的)。 - mickmackusa

0

让我们为这个任务构建一个多字节安全/Unicode安全的模式。

来自https://www.regular-expressions.info/unicode.html

代码:(演示)

echo preg_replace('/[^\p{L}\p{Z}\p{N}\p{P}]+/u', '', $string);

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