代码之家  ›  专栏  ›  技术社区  ›  Evernoob

我的瑞格鞋有多坏?

  •  2
  • Evernoob  · 技术社区  · 14 年前

    好吧,所以我在使用regex时设法解决了一个问题,但解决方案有点像怪物。

    要验证的字符串必须是:

    零或更多: A-Z a-z 0-9 ,空格或这些符号: . - = + ' , : ( ) /

    但是,第一个和/或最后一个字符不能是正斜杠 /

    这是我的解决方案(使用 preg_match php函数):

    "/^[a-z\d\s\.\-=\+\',:\(\)][a-z\d\s\.\-=\+\',\/:\(\)]*[a-z\d\s\.\-=\+\',:\(\)]$|^[a-z\d\s\.\-=\+\',:\(\)]$/i"
    

    一位同事认为这太大太复杂了。好吧,它起作用了,那真的有那么糟糕吗?有人想去参加雷杰克斯高尔夫吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Gumbo    14 年前

    您可以将表达式简化为:

    /^(?:[a-z\d\s.\-=+',:()]+(?:/+[a-z\d\s.\-=+',:()]+)*)?$/i
    

    外部 (?:…)? 允许空字符串。这个 [a-z\d\s.\-=+',:()]+ 允许以一个或多个指定字符开头,但 / . 如果A / 后面还必须跟一个或多个其他指定字符( (?:/[a-z\d\s.\-=+',:()]+)* )

    此外,在字符集内,只需转义字符 \ , ] ,也取决于位置 ^ - .

        2
  •  2
  •   Swizec Teller    14 年前

    试试这个

    function validate($string) {
       return (preg_match("/[a-zA-Z0-9.\-=+',:()/]*/", $string) && substr($string, 0,1) != '/' && substr($string, -1) != '/'))
    }
    

    特别检查第一个和最后一个字符要简单得多。否则,在处理空字符串等问题时,您就要处理大量开销。例如,regex要求字符串至少有一个字符长,否则它将无法验证。尽管“”符合您的标准。

        3
  •  2
  •   Alan Moore Chris Ballance    14 年前
    '#^(?!/)[a-z\d .=+\',:()/-]*$(?<!/)#i'
    

    正如其他人所观察到的,这些字符中的大多数不需要在字符类中进行转义。此外,如果连字符是最后列出的内容,则不需要对其进行转义;如果使用其他字符作为regex分隔符,则不需要对斜杠进行转义。( # 在这种情况下,但是 ~ 也是一个流行的选择)。

    我还放弃了双引号而改用单引号,这意味着我必须在regex中转义单引号。这是值得的,因为单引号字符串使用起来要简单得多:不 $variable 插值,无嵌入可执行文件 {code} ,您必须为它们转义的唯一字符是单引号和反斜杠。

    但是这里的主要创新是使用lookahead和lookback来排除斜线作为第一个或最后一个字符。这也不仅仅是一个代码高尔夫战术;无论如何,我都会用这种方式编写regex,因为它更好地表达了我的意图。为什么要强迫下一个人解析那些几乎相同的字符类,而你只需说出你的意思?”…但是第一个和最后一个字符不能被斜杠。”