Использование символа двоеточия в регулярном выражении
Я новичок в 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 & 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