【问题标题】:Regex: Replace any non-alphanumeric string except space正则表达式:替换除空格外的任何非字母数字字符串
【发布时间】:2013-11-04 14:34:36
【问题描述】:

抱歉,我从来没有掌握过正则表达式。

我需要从字符串中删除任何不是字母数字的内容(从产品名称中,其中一些包含与号),不包括空格。

到目前为止,我有这个(从另一个 stackoverflow post 找到):

$productname = preg_replace("~[\W]~","",$product['name']);

现在这会将所有字母数字替换为“”。这很好,除了我想排除空格,因为它当前正在删除所有空格。另外,我在任何地方都找不到波浪号 (~) 在正则表达式中的作用。

关于空格,我看到?! 实现了负前瞻,但我不知道如何将其合并到上面。

【问题讨论】:

  • ~ 是 PCRE 正则表达式的分隔符,php.net/manual/pt_BR/regexp.reference.delimiters.php
  • I have never gotten to grips with regex expressions. 正则表达式的意思是“正则表达式”,所以你不需要说正则表达式,因为它就像说:正则表达式表达式。只是一个提示。 :)
  • @RafaelBarros 呵呵谢谢 :)

标签: php regex


【解决方案1】:

另外,我在任何地方都找不到波浪号 (~) 在正则表达式中的作用。

PHP 中的正则表达式包含在一组分隔符中,通常是~,但您可以使用任何非字母数字字符,文档中提到的少数字符除外。

现在,如果您想替换任何不包括空格的非字母数字,那么您可以这样做:

~[^a-zA-Z0-9\s]+~
  • 字符类中的^ [] 使字符类匹配其中未提及的任何内容,例如[^a] 匹配除a 之外的任何内容。
  • a-z 匹配小写字母。
  • A-Z 匹配大写字母。
  • 0-9 匹配数字。
  • \s 匹配空格字符。
  • ^ 使上一个类匹配除提到的内容之外的所有内容。
  • + 在字符类之后,使字符类匹配一个或多个字符类中未提及的字符。

\W单独匹配非单词字符,那么单词字符是什么?

单词字符通常是任何字母(小写、大写)、数字或下划线_

单词字符\w(带小号w通常等于这个字符类[a-zA-Z0-9_]。

\W (big W) 匹配非单词字符,因此它匹配除\w 匹配的任何内容,包括空格,因此它也会删除空格。

【讨论】:

  • 这似乎不起作用,它将我的整个字符串擦干净。我想删除所有个字母数字字符除了个空格?
  • @Chud37 您要删除所有字母数字或字母数字?
  • 抱歉:我想删除所有个非字母数字字符除了个空格
  • @Chud37 你是对的,对不起。我要修复它或删除答案。
  • 没试过,不懂用扩展版替换\W的逻辑?
【解决方案2】:

你可以在类块中做简单的否定

$productname = preg_replace("#[^A-Za-z0-9]+#","",$product['name']);

它将用“”替换所有不是字母数字的内容

【讨论】:

  • 谢谢,能解释一下吗?另外,为什么你失去了\W 支持A-Za-z0-9,为什么你的开始^[] 内?
  • ^ 用于否定,表示类中的字符不能在单词中。
  • 这也会删除空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多