irc昵称的pcre表达式?

Posted

技术标签:

【中文标题】irc昵称的pcre表达式?【英文标题】:pcre expression for irc nicknames? 【发布时间】: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、- 或 .,替换它。

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

【问题讨论】:

【参考方案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昵称来说太有限了。

以上是关于irc昵称的pcre表达式?的主要内容,如果未能解决你的问题,请参考以下文章

在当前昵称下运行 IRC 机器人?

IRC中的昵称、用户名、实名有啥区别,密码是啥?

使用正则表达式转换对话 IRC 日志?

用正则表达式匹配 IRC 频道

使用正则表达式在 IRC 日志中提取用户名?

PCRE-正则库及用法