【问题标题】:RegEx for cleanup a string用于清理字符串的正则表达式
【发布时间】:2011-01-15 16:43:27
【问题描述】:

此 RegEx 用于清除搜索表单中的用户输入

$query = preg_replace("/[^A-Za-z0-9 _.,*&-]/", ' ', $query);

我也需要将斜杠添加为有效字符,但如果我添加它,我会收到错误消息。我想我必须逃避它,但找不到怎么做

$query = preg_replace("/[^A-Za-z0-9 _.,*&-/]/", ' ', $query); // doesn't works
$query = preg_replace("/[^A-Za-z0-9 _.,*&-//]/", ' ', $query); // doesn't works
$query = preg_replace("/[^A-Za-z0-9 _.,*&-\/]/", ' ', $query); // doesn't works

使用 php

【问题讨论】:

  • 至少使用 php-5.1.6,您的最后一个示例 (...\/]/") 运行良好。

标签: php regex validation


【解决方案1】:

你应该转义两次 - 你需要创建字符串"\/",所以反斜杠也应该转义为"\\/"

$query = preg_replace("/[^A-Za-z0-9 _.,*&\\/-]/", ' ', $query); 

另外,请确保将 - 移到末尾,或者也将其转义。它在字符集中的两个字符之间存在差异。

【讨论】:

    【解决方案2】:

    您可以使用除 / 之外的其他内容作为分隔符 - 尝试如下操作:

    $query = preg_replace("%[^A-Za-z0-9 _.,*&-/]%", ' ', $query);
    

    Kobe 还发布了在这种情况下转义的正确方法,但我发现当我将分隔符切换为表达式中未使用的分隔符时,正则表达式的可读性更高。

    编辑

    可以在http://www.php.net/manual/en/regexp.reference.delimiters.php 找到一些附加信息(在此引用:)

    "在使用 PCRE 函数时,要求模式用分隔符括起来。分隔符可以是任何非字母数字、非反斜杠、非空白字符。"

    【讨论】:

    • 我知道这是一个愚蠢的问题,但现在我觉得更愚蠢了。我不知道你可以使用其他分隔符...
    • 同意 - 你的更整洁。不过请确保移动-,您接受介于 &/ 之间的字符!
    • 我添加了一些关于使用备用分隔符的信息。 % 是我个人的 goto,但我看到 ~ 也经常使用。
    【解决方案3】:

    要转义一个字符,只需在它前面加上一个反斜杠;但不要忘记您使用的是双引号字符串——这可能是让这变得更难的原因:您可能必须对反斜杠本身进行分隔。


    我通常使用的另一种解决方案是使用不同的正则表达式分隔符,你的正则表达式中没有。例如,使用 #

    $query = preg_replace("#[^A-Za-z0-9 _.,*&-/]#", ' ', $query);
    

    这应该可以解决问题:-)

    【讨论】:

      【解决方案4】:
      $query = preg_replace("/[^A-Za-z0-9 _.,*&-\/]/", ' ', $query);
      

      如果你用单引号写它会起作用,像这样:

      $query = preg_replace('/[^A-Za-z0-9 _.,*&\/-]/', ' ', $query);
      

      这是因为包含在 " 中的字符串被解析为 \n、\r \t 等和 $vars。因此;转义 / 会使 PHP 尝试为 "/" 找到特殊含义,如 "\ n",当它失败时,它会删除反斜杠。

      不解析包含在 ' 中的字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 2022-01-25
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多