pcre выражение для псевдонимов irc? - PullRequest
1 голос
/ 13 октября 2010

Привет, ребята, у меня есть несколько проблем с использованием PCRE для правильного форматирования псевдонима irc.Я не очень хорошо разбираюсь в PCRE, и мне бы хотелось получить несколько советов от тех, кто использует PCRE / regex.:)

В настоящее время я использую это выражение: /^([^A-Za-z]{1})([^A-Za-z0-9-.]{0,32})$/ Я использую его следующим образом: preg_replace($regex, $replaceWith, $content)

Я предполагал, что это означает, начиная с начала до конца, любоесимволы, которые не являются AZ, az или 0-9 для первого символа, замените его.Любые символы после этого, которые не являются AZ az, 0-9, - или., Заменяют его.

Если кто-то может помочь, вы бы очень помогли.Это единственное, что мешает мне выпустить чат-продукт для нового программного обеспечения форума.: /

Ответы [ 2 ]

2 голосов
/ 12 апреля 2014

Я использовал следующее регулярное выражение для проверки псевдонимов в журналах 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, раздел 2.3.1 , в которых говорится, что первый символ должен быть буквой (a-zA-Z) или специальным ([]{}^`|_\) и остальные символы могут быть буквами, специальными символами, цифрами (0-9) или дефисами (-). Я выбрал максимальную длину 32, основанную на NICKLEN=32 GTAnet вместо максимальной длины RFC 9, потому что многие сети, кажется, не следуют этому стандарту. Максимальная длина зависит от сети IRC, поэтому настройте ее по мере необходимости.

0 голосов
/ 13 октября 2010

Я не уверен, что вы пытаетесь заменить, но было бы лучше проверить, соответствует ли строка имени пользователя (а не не соответствует), а затем заменить, если она не '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
...