函数只返回字符串中的字母数字字符?

Posted

技术标签:

【中文标题】函数只返回字符串中的字母数字字符?【英文标题】:Function to return only alpha-numeric characters from string? 【发布时间】:2011-07-09 02:53:06 【问题描述】:

我需要第二个功能相同但只返回字母字符 A-Z。

非常感谢任何帮助。

【问题讨论】:

这些在哪个 Unicode 规范化形式中,您为什么要这样做? 当您说 A-Z 和“字母数字”时,您的意思是真的只有 A-Z 还是要匹配所有语言的所有字母,包括外语和过时的脚本? 如果您这样做是为了进行不区分重音的字符串比较,那么您做错了。 只是“来自所有语言”。是英文的。英语使用拉丁文字。有unichars '\pLatin' '\pAlphabetic' '[^A-Za-z]' | wc -l == 1192 个拉丁字母但不是 A-Z 的代码点。人们普遍认为 ASCII 对英语来说就足够了。不是,这就是为什么写 A-Z 有一种代码味道的原因。 @Scott B:英语不仅仅使用 A-Z 的 26 个字母。例如,单词 ressumé 包括 é。也许您可以解释一下您要做什么,因为这可能会帮助您获得更好的答案。 【参考方案1】:

警告:请注意,英语不仅限于 A-Z。

尝试this 删除除 a-z、A-Z 和 0-9 之外的所有内容:

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

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

尝试this 只留下 A-Z:

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

警告的原因是像 résumé 这样的词包含字母 é 不会被匹配。如果要匹配特定的字母列表,请调整正则表达式以包含这些字母。如果要匹配所有字母,请使用 cmets 中提到的相应字符类。

【讨论】:

不,字母数字是 [\pAlphabetic\pNumeric]。我忘记了 PCRE 字母属性,但你可以用 [\pL\pM\pN] 来近似它。 @tchrist:我认为因为他特别提到了 A-Z,所以他只想匹配那个,尽管我承认这个问题在这一点上可能会更清楚。我会要求澄清。 @Mark,我并没有与你答案的第二部分争论,尽管如果他没有先规范地分解字符串,它就不会正常工作。我在和第一部分争论。此外,我尝试始终正确处理 any 数据的正则表达式,而不仅仅是发霉的旧 ASCII。 :) 因此,千禧年的这一边,[A-Z] 总是错的,有时 @Mark Byers,我明白了……是的,我更喜欢i,但我只需要担心英语人口统计……我忘记了很多人必须考虑其他语言。顺便说一句,我刚刚注意到您是从未问过 1 个问题的最高代表用户。甚至 Jon Skeet 也曾问过问题! 为什么正则表达式的末尾有一个+?如果你删除它,它会不会......一样吗?【参考方案2】:

除了preg_replace,您始终可以通过filter_var() 函数与FILTER_SANITIZE_STRING 一起使用php's filter functions。

【讨论】:

PHP 是否可以访问 ISO Stringprep 算法?我知道 Perl 和 Java 可以。 我相信字符串过滤功能主要适用于 7 位 ASCII,但不要引用我的话。 拜托,您能告诉我们使用FILTER_SANITIZE_STRING 执行用户要求的明确方式吗?据我所知,可以通过这种方式归档的最接近的是FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH,但这不仅会留下字母和数字,还会留下点、斜线、百分比等等。 它看起来更像是评论而不是答案。写答案时给出适当的解释。 不幸的是,我不相信那里有一个实际的 FILTER_SANITIZE 到字母数字。相当大的遗漏。

以上是关于函数只返回字符串中的字母数字字符?的主要内容,如果未能解决你的问题,请参考以下文章

C语言的题目,规定输入的字符只包含字母和*号。请编写函数fun,功能是:将字符串中的前导*全删除,

常见的字符测试函数

python使用正则表达式删除字符串中的其它字符只保留数字和字母

ctype.h / cctype 中的字符函数

从 NSString 中去除非字母数字字符

仅反转句子中字母表的字符串,而不是java中的数字或特殊字符