【问题标题】:PHP preg_match_all remove url parameters on the flyPHP preg_match_all 即时删除 url 参数
【发布时间】:2015-01-26 00:21:12
【问题描述】:

我只想获取不带任何参数的 url 的“更清洁”版本。 IOW...如果网址中有问号,请删除它,然后删除所有内容。

这是我当前的行:

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

为了在这里更清楚......我期待这个网址(例如):

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

应该是:

/go/page/mobile_download_apps.html

【问题讨论】:

  • 这不是诀窍吗? /(&lt;a href=")(.*)(\?.*)/s(缺少一些信息以提供更详细的答案...)
  • @Benoît 是的。但仅在此示例中,不适用于其他情况,例如当? 不在时。 (而且 OP 只会不断重复这些正则表达式问题,而不会试图理解它们的作用。)
  • 最好的方法是使用一些 DOM 解析器获取 url,然后使用正则表达式删除尾随部分...即:获取所有内容直到第一个 ? => regex101.com/r/mD3sB1/1
  • 这很容易删除之后的所有内容?但我在问是否可以直接通过正则表达式即时完成
  • @Enissay 完全删除它...(无需捕获)

标签: php regex string preg-match preg-match-all


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你的意思是这种行为吗:

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

    【讨论】:

      【解决方案3】:

      正如 cmets 中提到的,您不应该使用正则表达式获取标签,而应该使用解析器。不过,给你:

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

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

      【讨论】:

      • 反向引用 [^\1] 在字符类中不起作用。
      【解决方案4】:

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

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

      这是最后一行:

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

      【讨论】:

        猜你喜欢
        • 2010-12-19
        • 1970-01-01
        • 2021-04-02
        • 2013-03-24
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 2014-10-25
        相关资源
        最近更新 更多