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表达式?的主要内容,如果未能解决你的问题,请参考以下文章