PHP preg_match_all 即时删除 url 参数

PHP preg_match_all remove url parameters on the fly

我只想获取 url 的 'cleaner' 版本,不带任何参数。 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

你是指这种行为吗:

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


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

如评论中所述,您不应使用正则表达式获取标记,而应使用解析器。不过,给你:

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

演示:https://regex101.com/r/tV5pP8/3

使用 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]);

哎呀...我这边注意力不集中:)

自己解决了...(超级简单)

这是最后一行:

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