我需要从字符串中删除所有不在
有人有这样做的函数吗?
a-z A-Z 0-9
集合内或不是空格的字符。有人有这样做的函数吗?
听起来你已经知道你想做什么了,你基本上将它定义为一个正则表达式。
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
对于Unicode字符,它是:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
包括 \d
,所以 \d
是不必要的。此外,这是错误的,因为它还会在结果字符串中保留下划线(也包含在 \w
中)。 - smathy[:alnum:]
已经包含了大小写字母和数字,这里是否真的需要使用 i
标志呢? - But those new buttons though..正则表达式就是你的答案。
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
表示不区分大小写。^
表示不以...开头。\d
匹配任何数字。a-z
匹配介于 a
和 z
之间的所有字符。由于参数中包含 i
,因此您不必指定 a-z
和 A-Z
。\d
后面有一个空格,因此在这个正则表达式中允许出现空格。如果需要支持其他语言,可以使用以下方式代替典型的A-Z:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
定义了一个 否定 字符类(它将匹配未定义的字符):\p{L}
: 任意语言中的字母。\p{N}
: 任意脚本中的数字字符。
: 空格字符。+
贪婪地 匹配该字符类1到无限次。这将保留来自其他语言和脚本的字母和数字以及 A-Z:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
注意: 这是一个非常古老但仍然相关的问题。我回答纯粹是为了提供可能对未来访客有用的补充信息。
u
标志,它对我有效-- /[^\p{L}\p{N} ]+/u
- vatavale这是一个非常简单的正则表达式:
\W|_
并且可以根据您的需要使用它(使用前向/
斜杠分隔符)。
preg_replace("/\W|_/", '', $string);
使用这个强大的工具来测试正则表达式并了解其工作原理:
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
它选择所有不是 A-Z、a-z、0-9 的字符并将其删除。<?php
$strings="
_____________________
--> Welcome to RegExr v2.1 by gskinner.com, proudly hosted by Media Temple!
Edit the Expression & Text to see matches. Roll over matches or the expression for details. Undo mistakes with ctrl-z. Save Favorites & Share expressions with friends or the Community. Explore your results with Tools. A full Reference & Help is available in the Library, or watch the video Tutorial.
Sample text for testing: ª²³µ - Académie Française ______________---__
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 _+-.,!@#$%^&*();\\/|<>\"\'
12345 -98.7 3.141 .6180 9,000 +42
555.123.4567 +1-(800)-555-2468
foo@demo.net bar.ba@test.co.uk
www.demo.com http://foo.co.uk/
http://regexr.com/foo.html?q=bar
https://mediatemple.net
";
/* No line break */
$string = preg_replace("/[\W]+/u", '', $strings);
echo "Option 1:".$string;
/* Keep line break */
$string = preg_replace("/[^\n\w]+/u", '', $strings);
echo "\n\nOption 2:". $string;
?>
PHP 8.1.12 的输出
Option 1: _____________________WelcometoRegExrv21bygskinnercomproudlyhostedbyMediaTempleEdittheExpressionTexttoseematchesRollovermatchesortheexpressionfordetailsUndomistakeswithctrlzSaveFavoritesShareexpressionswithfriendsortheCommunityExploreyourresultswithToolsAfullReferenceHelpisavailableintheLibraryorwatchthevideoTutorialSampletextfortestingª²³µAcadémieFrançaise________________abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_1234598731416180900042555123456718005552468foodemonetbarbatestcoukwwwdemocomhttpfoocoukhttpregexrcomfoohtmlqbarhttpsmediatemplenet
Option 2:
_____________________
WelcometoRegExrv21bygskinnercomproudlyhostedbyMediaTemple
EdittheExpressionTexttoseematchesRollovermatchesortheexpressionfordetailsUndomistakeswithctrlzSaveFavoritesShareexpressionswithfriendsortheCommunityExploreyourresultswithToolsAfullReferenceHelpisavailableintheLibraryorwatchthevideoTutorial
Sampletextfortestingª²³µAcadémieFrançaise________________
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_
1234598731416180900042
555123456718005552468
foodemonetbarbatestcouk
wwwdemocomhttpfoocouk
httpregexrcomfoohtmlqbar
httpsmediatemplenet
\W
是 \w
的反义词,\w
包括字符 A-Za-z0-9_
。因此,\W
将匹配任何不是 A-Za-z0-9_
的字符并将其删除。[]
是字符集边界。+
在字符集边界上是多余的,但通常表示一个或多个字符。u
标志扩展了表达式以包括 Unicode 字符支持,这意味着它不会删除超出字符代码 255 的字符,例如 ª²³µ
。各种用法的示例 https://3v4l.org/hSVV5 包括 Unicode 和 ASCII 字符。 - Will B.
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
- 2540625