【问题标题】:Regex to only allow alphanumeric, comma, hyphen, underscore and semicolon正则表达式仅允许字母数字、逗号、连字符、下划线和分号
【发布时间】:2012-03-09 03:39:25
【问题描述】:

我已经有了一些工作代码,但如果可以的话,我需要有人帮助解释为什么它可以工作!

我正在使用 PHP 替换字符串中的任何内容,如果它不是 az、AZ、0-9、逗号、分号、下划线或连字符(最终应该代表单个用户名或逗号) /分号分隔的用户名列表)。

以下作品:

$data = preg_replace('/[^,;a-zA-Z0-9_-]/s', '', $data);

但以下不是:

$data = preg_replace('/[^a-zA-Z0-9_-,;]/s', '', $data);

为什么这仅在逗号和分号开头时才有效?把它们放在最后似乎会破坏事情(这是我最初遇到 /[^a-zA-Z0-9_-]/s 时尝试的方法。

顺便说一句,我还使用以下内容来修剪任何 尾随 分号(复数)或逗号(复数),有人可能会建议一种更有效和/或更优雅的方法这个?:

if(preg_match('/;$/', $data))
{
    $data = rtrim($data, ';' );
}
if(preg_match('/,$/', $data))
{
    $data = rtrim($data, ',' );
}

感谢您的帮助:)

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    不是逗号和分号导致您的问题;这是连字符。查看角色类的各个部分并考虑它们的含义:

    0-9 # Anything from '0' to '9', meaning 0, 1, 2, ... 9
    A-Z # Anything from 'A' to 'Z', meaning A, B, C, ... Z
    _-, # Anything from '_' to ',', meaning...uh...hmmm.
    

    _, 没有明确的进展,因此正则表达式引擎不确定如何处理。在字符类中,如果您想按字面解释连字符,则它需要位于类的开头或结尾(或用反斜杠转义)。所以这些都可以工作:

    [^,;a-zA-Z0-9_-]
    [^-,;a-zA-Z0-9_]
    [^a-zA-Z0-9_\-,;]
    

    至于修剪结尾,您可以在一个正则表达式替换中完成所有这些操作:

    $data = preg_replace('/[^,;a-zA-Z0-9_-]|[,;]$/s', '', $data);
    

    【讨论】:

    • “从 _, 没有明确的进展”:有一个非常明确的进展:它基于 Unicode 表。然而,在这种情况下,_ 在 Unicode 表中 , 之后出现,因此范围是不可能的。
    • @Xufox - 好吧,这将使它成为一种回归,不是吗? ;) 关键是正则表达式引擎无法理解任何进展。但你是对的,there's apparently a valid progression in the other direction,从,_。直到现在我才知道,谢谢!
    【解决方案2】:

    我认为重要的是连字符的位置 - 必须在开头或结尾才能成为连字符(文字),否则它被用于定义范围。

    【讨论】:

    • +1 另请注意,您可以简单地使用反斜杠来转义第二个模式中的流氓连字符,它的工作方式与第一个模式相同:'/[^a-zA-Z0-9_\-,;]/s'
    【解决方案3】:

    您可以转义连字符并将其放在正则表达式中的任何位置,例如\-

    至于结尾的分号和逗号,试试这个/[,;]+$/ 它应该匹配末尾的任何逗号和分号,即使它们很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      相关资源
      最近更新 更多