V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wapptm
V2EX  ›  PHP

preg_match_all 正则匹配问题求教

  •  
  •   wapptm · 2022-05-27 21:35:56 +08:00 · 1363 次点击
    这是一个创建于 890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人是新手,以为目前正在学习 wordpress 建站,所以开始学习一些 php 语言 目前遇到一个问题,我需要将网站中的所有下载网址的链接转换为 go 跳转链接,经测试如下代码

    //给外部链接加上跳转
    add_filter('the_content','the_content_nofollow',999);
    function the_content_nofollow($content)
    {
    preg_match_all('/<a(.?)href="(.?)"(.*?)>/',$content,$matches);
    if($matches){
    foreach($matches[2] as $val){
    if(strpos($val,'://')!==false && strpos($val,home_url())===false && !preg_match('/.(jpg|jepg|png|ico|bmp|gif|tiff)/i',$val)){
    $content=str_replace("href="$val"", "href="".home_url()."/go/?url=$val" ",$content);
    }
    }
    }
    return $content;
    }

    这个代码会将所有的非本站链接自动跳转到 /go/目录下的跳转链接页面,但是存在两个问题: 一是对于中间带有#号的链接,就只能截取#号前的部分,#号以后部分无法截取,比如: https://www.XXX.com/dsajldklasdlsdk#dkcnjjjjlsdlkl 这个网址,就只能截取 https://www.XXX.com/dsajldklasdlsdk# 后面的 dkcnjjjjlsdlkl 截取不到。 二是这个代码会将所有的外部链接都跳转,可是我只需要对指定链接跳转,比如,只跳转 www.baidu.com 以及 www.google.com 开头的链接,其他链接都不跳转,那么我该如何修改这个 preg_match_all 后面的代码呢,请指教或者指点一个方向,谢谢!

    2 条回复    2022-05-27 23:46:48 +08:00
    moult
        1
    moult  
       2022-05-27 21:38:31 +08:00
    建议用 DOMDocument 去解析。正则容易误伤。
    rekulas
        2
    rekulas  
       2022-05-27 23:46:48 +08:00
    这正则看起来不是很合理的样子,我写了个你试试看
    /<a[^>]+href=[\'"]?(?<urls>[^>\'"]*)[\'"]?[^>]*>/is
    网上也有很多成熟正则了,一搜一大把

    第二个问题的话建议你用 preg_replace_callback 回调中判断并决定是否替换
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:43 · PVG 22:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.