регулярное выражение php для сопоставления страниц, групп и имен пользователей Facebook, но игнорирует ссылки с параметрами запроса

#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] $
  

Демонстрация регулярных выражений | Демонстрация Php