【问题标题】:pcre expression for irc nicknames?irc昵称的pcre表达式?
【发布时间】:2010-10-13 14:17:19
【问题描述】:

大家好,我在使用 PCRE 正确制作 irc 昵称格式时遇到了一些问题。我不擅长 PCRE,我希望你们中使用 PCRE / regex 的人给我一些建议。 :)

我目前正在使用这个表达式:/^([^A-Za-z]{1})([^A-Za-z0-9-.]{0,32})$/ 我正在使用它:preg_replace($regex, $replaceWith, $content)

我认为这意味着,从头到尾,任何不是 A-Z、a-z 或 0-9 的第一个字符的字符都替换它。之后的任何字符,其中不是 A-Z a-z、0-9、- 或 .,替换它。

如果有人可以提供帮助,您将大有帮助。这是阻止我将聊天产品发布到新论坛软件的唯一原因。 :/

【问题讨论】:

    标签: php regex pcre irc


    【解决方案1】:

    我一直在使用以下正则表达式来检查 IRC 日志中的昵称:

    /<([a-zA-Z\[\]\\`_\^\{\|\}][a-zA-Z0-9\[\]\\`_\^\{\|\}-]{1,31})>/
    

    像这样在 preg_match 中使用它:

    preg_match('/<([a-zA-Z\[\]\\`_\^\{\|\}][a-zA-Z0-9\[\]\\`_\^\{\|\}-]{1,31})>/', $line)
    

    我只是检查用户是否在线上说了什么,并且该行不只是加入/部分消息或昵称更改或类似的东西,但也很容易将其放入 preg_replace 中。

    它根据RFC 2812 Section 2.3.1中的昵称规则匹配昵称,其中第一个字符必须是字母(a-zA-Z)或特殊字符([]{}^`|_\),其余字符可以是字母,特殊字符, 数字 (0-9) 或连字符 (-)。我选择了基于 GTAnet 的 NICKLEN=32 的最大长度 32,而不是 RFC 的最大长度 9,因为许多网络似乎没有遵循这个标准。不同 IRC 网络的最大长度不同,因此请根据需要进行调整。

    【讨论】:

      【解决方案2】:

      我不确定您要替换的内容,但最好检查字符串 是否匹配 用户名(而不是不匹配),如果不匹配则替换't:

      $regex = '/^[a-z][a-z0-9.-]{0,32}$/i';
      if (!preg_match($regex, $content))
      {
        // do your replace here
      }
      

      正则表达式说:

      ^                   # Beginning of string
        [a-z]             # Match a single a-z
        [a-z0-9.-]{0,32}  # Match between 0 and 32 occurances of a-z, 0-9, . or -
      $                   # End of string
      /i                  # Make the pattern case-insensitive
      

      【讨论】:

      • 我试图替换与“”匹配的字符。对不起,忘了提这个。提供的似乎不起作用,但我已经明白了一些事情:“#([^a-z0-9]{0,32})#i”——它可能不能完全满足我的需要,但我m 使用 substr() 连续删除第一个字符(如果它是数字),直到它是字母、符号或空白。如果您有任何其他建议,请告诉我。并感谢您的回复/帮助:)
      • 如果您只想删除无效字符,请使用preg_replace('/[^a-z0-9.-]+/i', '', $content)。您不应该尝试在同一操作中验证修复格式。
      • 根据this question,你上面的字符集对于IRC昵称来说太有限了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2014-04-23
      • 2014-02-13
      相关资源
      最近更新 更多