PHP preg_match_all удаляет параметры URL на лету

0

Я хочу получить только "чистую" версию URL без каких-либо параметров. IOW... если в URL-адресе есть вопросительный знак, удалите его и все после этого.

Вот моя текущая строка:

preg_match_all('/<a(.*?)href=("|\'|)(.*?)("|\'| )(.*?)>/s',$content,$ahref);

И просто для того, чтобы быть более ясным здесь... Я ожидаю, что этот URL (например):

/go/page/mobile_download_apps.html?&who=r,6GDewh28SCW3/fUSqmWqR_E9ljkcH1DheIMqgbiHjlX3OBDbskcuCZ22iDvk0zeZR7BEthcEaXGFWaQ4Burmd4eKuhMpqojjDE6BrCiUtLClkT32CejpMIdnqVOUmWBD

Было бы:

/go/page/mobile_download_apps.html
  • 1
    Разве это не поможет? /(<a href=")(.*)(\?.*)/s (отсутствует некоторая информация, чтобы дать более подробный ответ ...)
  • 1
    @Benoît Бенуа Да, это так. Но только в этом примере, а не для других случаев, например, когда ? отсутствовал (И OP будет просто повторять эти вопросы регулярных выражений, не пытаясь понять, что они делают.)
Показать ещё 5 комментариев
Теги:
string
preg-match
preg-match-all

4 ответа

5
Лучший ответ

С DOMDocument, strpos, substr:

$dom = new DOMDocument;
$dom->loadHTML($content);

$linkNodeList = $dom->getElementsByTagName('a');

foreach($linkNodeList as $linkNode) {
    $href = $linkNode->getAttribute('href');

    if ( false !== ($offset = strpos($href, '?')) )
        $linkNode->setAttribute('href', substr($href, 0, $offset));
}

$newContent = $dom->saveHTML();

или с взрывом:

$linkNode->setAttribute('href', explode('?', $href)[0]);
0

Вы имеете в виду это поведение:

<a\s+href\s*=\s*"\K[^"?]+


$result = preg_replace('/<a\s+href\s*=\s*"\K[^"?]+/im', '', $text);
0

Как упоминалось в комментариях, вы не должны получать тег с регулярным выражением, вы должны использовать синтаксический анализатор. Тем не менее, здесь вы идете:

<a[^>]+href=("|')([^"'?]*)[^"']*\1[^>]*>

Демо: https://regex101.com/r/tV5pP8/3

  • 2
    Обратные ссылки [^\1] не работают в классах символов.
  • 0
    Ах да, исправил это.
-1

Оппс... Отсутствие концентрации с моей стороны :)

Решил его сам... (Это было очень просто)

Вот окончательная строка:

preg_match_all('/<a(.*?)href=("|\'|)(.*?)(\?|"|\'| )(.*?)>/s',$content,$ahref);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню