требуется помощь preg_match

#php #preg-match

#php #preg-match

Вопрос:

Привет, мне нужна помощь в изменении preg_match для проверки наличия 2-16 символов A-z 0-9 -_ и пробела. Прямо сейчас это контрольный URL, поэтому мне нужно удалить протокол, добавить пробел и 2-16 min / max chr.

 public function checkUrl($string)
{
    if(empty($string) || preg_match("#^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*) ):?(d )?/?#i", $string))
    {
        return true;
    }
    else
    {
        if( isset($this) )
        {
            $this->addError("Input Error");
        }
        return false;
    }
}
  

Ответ №1:

Я не уверен, какую часть вы хотите изменить, но…

[Необходимо сопоставить] 2-16 символов A-z 0-9 -_ и пробел.

 [w- ]{2,16}
  
  • w совпадения a-z , A-Z , 0-9 и _ .
  • - будет соответствовать литералу - в символьном классе за пределами допустимого диапазона.
  • ' ' будет соответствовать пробелу (игнорируйте кавычки, Stack Overflow нуждался в них для отображения). Чтобы сопоставить любой символ пробела, используйте s .
  • {2,16} количественно совпадение составит от 2 до 16 раз включительно.
  • Вы также можете изменить (http|https|ftp) на (?:https?|ftp) , который не будет захватывать группу, поскольку вы не используете никаких обратных ссылок.

Комментарии:

1. Опереди меня в этом. Единственное: разве тире не должно быть на первом месте? Или, если он не создает допустимый диапазон, он просто интерпретируется как буквальный?

2. @sdleihssirhc отлично подходит для моего теста 🙂 Если это недопустимый диапазон, он считается литералом.

Ответ №2:

В соответствии с regular-expressions.info , есть некоторые вещи, которые вы можете сделать:

  • A-Z, a-z, 0-9 и _ могут быть сопоставлены с w
  • Минимальное / максимальное значение может быть задано с помощью скобок {min, max}

Итак, чтобы проверить наличие «2-16chars A-z 0-9 -_ и пробел», нам нужно было бы сделать что-то вроде этого:

 [- w]{2,16}