正则表达式 - 删除所有非字母数字字符CRLF问题

时间:2011-09-25 23:12:37

标签: php regex

首先,如果从标签中看不清楚,我在PHP中这样做 - 但这可能并不重要。

我有这段代码:

$inputStr = strip_tags($inputStr);
$inputStr = preg_replace("/[^a-zA-Z\s]/", " ", $inputStr);

这似乎完全删除了所有HTML标签和几乎所有特殊和非字母字符。一个问题是,由于某种原因,它不会过滤掉carraige返回/换行(只是组合)。

如果我添加这一行:

$inputStr = preg_replace("/\s+/", " ", $inputStr);
然而,最后,它的效果很好。有人能告诉我:

  1. 为什么第一个preg_replace没有过滤掉CR / LF?
  2. 这第二个preg_repalce实际上在做什么?我理解大部分的第一个,但第二个让我困惑 - 它有效,但我不知道为什么。
  3. 我能以某种方式将它们组合成一行吗?

3 个答案:

答案 0 :(得分:2)

  1. 你告诉它删除除字母和空格之外的所有内容。换行符是空格,因此它们不会被删除。您可以使用\h代替\s来排除水平空格。
  2. 它只是意味着“用一个空格替换一个或多个空白字符(\s+)的每个序列。”
  3. preg_replace("/[^A-Za-z]+/", " ", ...)可能会这样做。

答案 1 :(得分:1)

  1. \s匹配\n
  2. 等空格
  3. 用空格替换所有空格字符。
  4. 你可以把它变成一条不可读的线,但可能不是一个正则表达式。

答案 2 :(得分:1)

你的第一个正则表达式是删除所有不是字母或空格的字符。 CRLF是空格,因此不会被过滤掉。

第二个是用空格字符替换空格。从本质上讲,它将空白序列压缩到一个空间中(由于量词是贪婪的)。

我建议从第一个正则表达式中删除\s,看看是否有效。