Использование символа двоеточия в регулярном выражении

Я новичок в regex. Я изучаю его в regularexperssion.com. Вопрос в том, что мне нужно знать, что такое использование двоеточия (:) в регулярных выражениях.

Например:

$pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';

который соответствует

$url1  = "http://www.somewebsite.com";
$url2  = "https://www.somewebsite.com";
$url3  = "https://somewebsite.com";
$url4  = "www.somewebsite.com";
$url5  = "somewebsite.com";

Да, любая помощь будет очень оценена..:)

Ответы

Ответ 1

Colon : - это просто двоеточие. Это ничего не значит, кроме особых случаев, таких как, например, кластеризация без захвата (также известная как группа, не связанная с захватом):

(?:pattern)

Также он может использоваться в классах символов, например:

[[:upper:]]

Однако в вашем случае двоеточие - это всего лишь двоеточие.

Специальные символы, используемые в вашем регулярном выражении:

В классе символов [-+_~.\d\w]:

  • - означает -
  • + означает +
  • _ означает _
  • ~ означает ~
  • . означает .
  • \d означает любую цифру
  • \w означает любой символ слова

Эти символы имеют это значение, потому что они используются в классе символов []. Без символьного класса + и . имеют особое значение.

Другие элементы:

  • =? означает =, который может иметь место 0 или 1 раз; другими словами =, который может произойти или нет, необязательный =.

Ответ 2

Я решил пойти вам лучше и объяснить все регулярное выражение:

^                 # anchor to start of line
(                 # start grouping
 (                # start grouping
  [\w]+           # at least one of 0-9a-zA-Z_
  :               # a literal colon
 )                # end grouping
 ?                # this grouping is optional
 \/\/             # two literal slashes
)                 # end capture
?                 # this grouping is optional
(
 (
  [\d\w]          # exactly one of 0-9a-zA-Z_
                  # having \d is redundant
  |               # alternation
  %               # literal % sign
  [a-fA-f\d]{2,2} # exactly 2 hexadecimal digits
                  # should probably be A-F
                  # using {2} would have sufficed
 )+               # at least one of this groups
 (                # start grouping
  :               # literal colon
  (
   [\d\w]
   |
   %
   [a-fA-f\d]{2,2}
  )+
 )?               # Same grouping, but it is optional
                  # and there can be only one
 @                # literal @ sign
)?                # this group is optional
(
 [\d\w]           # same as [\w], explained above
 [-\d\w]{0,253}   # includes a dash as a valid character
                  # between 0 and 253 of these characters
 [\d\w]           # end with \w.  They want at most 255
                  # total and - cannot be at the start
                  # or end
 \.               # literal period
)+                # at least one of these groups
[\w]{2,4}         # two to four \w characters
(
 :                # literal colon
 [\d]+            # at least one digit
)?
(
 \/               # literal slash
 (
  [-+_~.\d\w]    # one of these characters
  |              # *or*
  %              # % with two hex digit combo
  [a-fA-f\d]{2,2}
 )*              # zero or more of these groups
)*               # zero or more of these groups
(
 \?              # literal question mark
 (
  &?         # literal &amp or &
  (
   [-+_~.\d\w]
   |
   %
   [a-fA-f\d]{2,2}
  )
  =?             # optional literal =
 )*              # zero or more of this group
)?               # this group is optional
(
 #               # literal #
 (
  [-+_~.\d\w]
  |
  %
  [a-fA-f\d]{2,2}
 )*
)?
$                # anchor to end of line

Важно понимать, что такое метасимволы/последовательности. Некоторые последовательности не являются метасимволами при использовании в определенных контекстах (особенно в классе символов). Я их каталогизировал для вас:

мета без контекста

  • ^ - нулевая ширина начала строки
  • () - группировка/захват
  • ? - нуль или одна из предшествующих последовательностей
  • + - одна или несколько из предыдущей последовательности
  • * - нулевая или более предыдущая последовательность
  • [] - класс символов
  • \w - буквенно-цифровые символы и _. Напротив \w
  • | - чередование
  • {} - утверждение длины
  • $ - конец линии нулевой ширины

Это исключает :, @ и % из любого специального/мета-значения в исходном контексте.

meta внутри символьного класса

] завершает класс символа. - создает диапазон символов, если он не находится в начале или в конце класса символов.

утверждения группировки

Комбинация

A (? запускает утверждение группировки. Например, (?: означает группу, но не захватывает. Это означает, что в regex /(?:a)/ он будет соответствовать строке "a", но a не будет использоваться для замены в группах замены или соответствия, как это было бы от /(a)/.

? также может использоваться для утверждений lookahead/lookbehind с ?=, ?!, ?<=, ?<!. (?, за которым следует любая последовательность, за исключением того, что я упоминал в этом разделе, является буквальным ?.

Ответ 3

В вашем случае особого использования для двоеточия : нет:

(([\w]+:)?\/\/)? будет соответствовать http://, https://, ftp://...

Вы можете найти одно специальное использование для двоеточия: каждая группа захвата, начинающаяся с (?:, не будет отображаться в результатах.
Например, с "foobarbaz" на входе:

  • /foo((bar)(baz))/ = > { [1] => 'barbaz', [2] => 'bar', [3] => 'baz' }
  • /foo(?:(bar)(baz))/ = > { [1] => 'bar', [2] => 'baz' }

Ответ 4

Двоеточие не имеет особого значения в регулярных выражениях, оно просто соответствует буквальному двоеточию.

[\w]+:

Это просто означает any word character 1 or more times followed by a literal colon Скобки на самом деле здесь не нужны. Квадратные скобки используются для определения группы символов для соответствия. Так

[abcd]

означает a single character of a, b, c, d