#php #regex
#php #регулярное выражение
Вопрос:
У меня есть следующие возможные совпадения
https://www.facebook.com/tr?id=13046212397316299911amp;amp;ev=pageviewamp;amp;noscript=1
https://www.facebook.com/pages/something
https://www.facebook.com/groups/something/
https://www.facebook.com/something
... random other non-facebook links
Последние 3 допустимы, но первый я хочу исключить с помощью preg_match_all
В настоящее время
У меня есть это регулярное выражение, которое включает в себя все 4 из них, и для первого оно совпадает с
https://www.facebook.com/tr
Но я хочу полностью исключить это
Это мое текущее регулярное выражение
$pattern = "/(?:(?:http|https)://|)(?:www.|)facebook.[a-z.] /((pages|groups)/|)[a-zA-Z0-9-_]{1,}/"
Также, когда оно совпадает, $matches содержит что-то внутри как [0], так и [1] и [2], и я не знаю, почему это происходит. Я просто хочу совпадение или отсутствие совпадения
Любая помощь, пожалуйста?
$links = [
'https://www.facebook.com/tr?id=13046212397316299911amp;amp;ev=pageviewamp;amp;noscript=1',
'https://www.facebook.com/pages/something',
'https://www.facebook.com/groups/something/',
'https://www.facebook.com/something',
];
$pattern = "/(?:(?:http|https)://|)(?:www.|)facebook.[a-z.] /((pages|groups)/|)[a-zA-Z0-9-_]{1,}/";
foreach ($links as $link) {
if ($matchesFound = preg_match($pattern, $link, $matches)) {
if ($matchesFound) {
d($matches);
}
}
}
array (3) [
0 => string (41) "https://www.facebook.com/groups/something"
1 => string (7) "groups/"
2 => string (6) "groups"
]
Комментарии:
1.Попробуйте
^https?://www.facebook.com/(?:pages/|groups/)?w /?$
демо
Ответ №1:
В вашем шаблоне вы используете 2 чередования, где у вас нет значения после последнего |
. Часть http или https можно сократить до https? и эта часть, включая the www.
, не обязательно должна находиться в группе, не связанной с захватом (?:
.
Вы можете переместить косую черту в группу, чтобы сопоставить страницы или группы, и сделать группу необязательной, используя знак вопроса. Затем сопоставьте необязательную косую черту в конце.
Если вы используете другой разделитель, тогда /
like ~
do не нужно экранировать косые черты.
Ваше регулярное выражение может выглядеть так:
^https://www.facebook.[a-z.] /(?:pages/|groups/)?[w-] /?$
Демонстрация регулярных выражений | Демонстрация Php
Например:
$pattern = '~^https://www.facebook.[a-z.] /(?:pages/|groups/)?[w-] /?$~';
Если вы хотите сопоставить больше, но не параметры строки запроса, вы можете сопоставить 1 без вопросительного знака или пробельного символа, используя класс отрицаемых символов [^?s]
.
^https://www.facebook.[a-z.] /(?:pages/|groups/)?[^?s] $