php regex для соответствия страниц facebook, групп и имен пользователей, но игнорирует ссылки с параметрами запроса - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть эти возможные совпадения

https://www.facebook.com/tr?id=13046212397316299911&ev=pageview&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,}/"

Также, когда совпадает, $ match содержит что-то внутри [0], [1] и [2], что я не знаю, почему это происходит.Я просто хочу матч или нет матча

Любая помощь, пожалуйста?

    $links = [
        'https://www.facebook.com/tr?id=13046212397316299911&ev=pageview&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 Ответ

1 голос
/ 10 апреля 2019

В вашем паттерне вы используете 2 чередования, где у вас нет значения после последнего |.Часть http или https может быть сокращена до https?и эта часть, включающая www., не обязательно должна входить в группу без захвата (?:.

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

Если вы используете другой разделитель, тогда /, как ~, не обязательно экранировать косую черту.

Ваше регулярное выражение может выглядеть следующим образом:

^https://www\.facebook\.[a-z.]+/(?:pages/|groups/)?[\w-]+/?$

Regex demo | Php demo

Например:

$pattern = '~^https://www\.facebook\.[a-z.]+/(?:pages/|groups/)?[\w-]+/?$~';

Если вы хотите сопоставить больше, но не параметры строки запроса, вы можете сопоставить 1+, а не знак вопроса или пробелchar с использованием отрицательного класса символов [^?\s]+.

^https://www\.facebook\.[a-z.]+/(?:pages/|groups/)?[^?\s]+$

Regex demo | Php demo

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