php 如何删除非字母数字字符?

wko9yo5t  于 2023-02-11  发布在  PHP
关注(0)|答案(7)|浏览(168)

我需要从字符串中删除所有不在a-z A-Z 0-9集合中的字符或不是空格的字符。
有没有人有这样的功能?

ou6hu8tu

ou6hu8tu1#

听起来你几乎已经知道你想做什么了,你基本上把它定义为一个正则表达式。

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
bxjv4tth

bxjv4tth2#

对于Unicode字符,它是:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
vxbzzdmp

vxbzzdmp3#

Regular expression就是您的答案。

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i代表不区分大小写。
  • ^表示,开头不是。
  • \d匹配任何数字。
  • a-z匹配az之间的所有字符。由于i参数,您不必指定a-zA-Z
  • \d之后有一个空格,所以在这个正则表达式中允许有空格。
col17t5w

col17t5w4#

如果您需要支持其他语言,而不是典型的A-Z,则可以使用以下代码:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]定义一个 negated(它将匹配定义的字符)字符类:
  • \p{L}:* 任何 * 语言的字母。
  • \p{N}any 脚本中的数字字符。
  • ``:空格字符。
  • + * greavely * 匹配字符类1到 unlimited 次。

这将保留其他语言和文字中的字母和数字以及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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

**注:**这是一个非常古老但仍然相关的问题。我的回答纯粹是为了提供补充资料,可能对未来的访问者有用。

tsm1rwdh

tsm1rwdh5#

下面是一个非常简单正则表达式:

\W|_

并在需要时使用(使用正斜杠分隔符/)。

preg_replace("/\W|_/", '', $string);

在这里用这个解释正则表达式功能的工具测试一下:
http://www.regexr.com/

brqmpdu1

brqmpdu16#

[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);

它选择所有非A-Z、a-z、0-9,然后删除。
请参见此处的示例:https://regexr.com/3h1rj

<?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
hfwmuf9z

hfwmuf9z7#

preg_replace("/\W+/", '', $string)

您可以在这里测试:http://regexr.com/

相关问题