函数仅从字符串返回字母数字字符?


98

我正在寻找一个php函数,该函数将接受一个输入字符串,并通过去除所有仅保留字母数字的特殊字符来返回其净化版本。

我需要另一个功能相同但仅返回字母字符AZ的函数。

任何帮助,不胜感激。


这些是哪种Unicode规范化格式,为什么要这样做?
tchrist 2011年

1
当您说AZ和“字母数字”时,您是真的意思是AZ还是要匹配所有语言(包括外语和过时的脚本)中的所有字母?
Mark Byers

如果这样做,则可以进行不区分重音符号的字符串比较,那么您做错了。
tchrist 2011年

3
只是“所有语言”。是英文 英文使用拉丁文字。有unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192个代码点是拉丁字母,但不是AZ。通常认为,ASCII足以满足英语要求。并非如此,这就是为什么编写AZ会有代码味的原因。
tchrist 2011年

1
@Scott B:英语不仅使用AZ的26个字母。例如,单词résumé包含é。也许您可以解释您要做什么,因为这可能有助于您获得更好的答案。
Mark Byers

Answers:


212

警告:请注意,英语不仅限于AZ。

尝试执行以下操作删除az,AZ和0-9以外的所有内容:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

如果字母数字的定义包括外语字母和过时的脚本,则您将需要使用Unicode字符类。

尝试以下操作仅保留AZ:

$result = preg_replace("/[^A-Z]+/", "", $s);

警告的原因是像简历这样的单词包含与é此不匹配的字母。如果要匹配特定的字母列表,请调整正则表达式以包括这些字母。如果要匹配所有字母,请使用注释中提到的适当字符类。


2
不,字母数字是 [\p{Alphabetic}\p{Numeric}]。我忘记了PCRE的字母属性,但是可以使用来近似[\pL\pM\pN]
tchrist 2011年

1
@tchrist:我认为因为他特别提到了AZ,所以他只想匹配它,尽管我承认在这一点上问题可能要清楚得多。我会要求澄清。
Mark Byers

1
@Mark,我没有在你答案的第二部分争论,尽管如果他没有先规范地分解字符串,那将无法正常工作。我在与第一部分争论。另外,我尝试始终正确处理可用于任何数据的正则表达式,而不仅仅是适用于发霉的旧ASCII。:)因此,千年的这一面有时[A-Z]总是错的。
tchrist 2011年

1
@Mark Byers,我知道..是的,我更喜欢。i但是我只需要担心英语的人口统计..我忘了很多人不得不考虑其他语言。顺便说一句,我刚刚注意到您是从未回答过一个问题的最高代表用户。甚至Jon Skeet都曾问过问题!
JD Isaacks 2011年

1
为什么在正则表达式的末尾有+号?如果将其删除会不会...相同?
丹尼斯

2

不是preg_replace,你总是可以使用PHP的过滤功能,使用filter_var()与功能FILTER_SANITIZE_STRING


PHP是否可以访问ISO Stringprep算法?我知道Perl和Java都可以。
tchrist 2011年

我相信字符串过滤器功能主要适用于7位ASCII,但请不要在此引用我的名字。
马克·贝克

30
拜托,您能告诉我们一种明确的方式来执行用户要求使用的方式FILTER_SANITIZE_STRING吗?据我所知,可以用这种方式归档的最接近的是FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH,但不仅会留下字母和数字,还会留下点,斜线,百分数等。
Pere 2014年

$ iMycleanVar = filter_var($ sStringWithNumbers,FILTER_SANITIZE_NUMBER_INT);
Sultanos

4
它看起来更像是评论而不是答案。在写答案时给出正确的解释。
Siraj Alam

0
  1. 将数字[ 0-9 ]和字母通常表示为[ \ pL ]:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. 专门针对字母A到Z(不区分大小写)[ a-zA-Z ]:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.