dsfykqq3403 2017-10-23 07:18
浏览 33
已采纳

更改php中的所有href链接

Currently working on something where i need to add the UTM tag to all links, got 1/2 minor issues i cant figure out

This is the code im am using, the issue is if a link got a parameter like ?test=test then this refuses to add the utm tags.

The other issue is a minor issue that im not sure would make sence to change, insted of me having to add a url, it could be neat if it added utm tags to ALL a href's by default with out knowing the domain name.

Hope someone can help me out and push me in the right direction.

$url_modifier_domain = preg_quote('add-link.com');

$html_text = preg_replace_callback(
    '#((?:https?:)?//'.$url_modifier_domain.'(/[^\'"\#]*)?)(?=[\'"\#])#i',
    function($matches){
        $url_modifier = 'utm=some&medium=stuff';
        if (!isset($matches[2])) return $matches[1]."/?$url_modifier";
        $q = strpos($matches[2],'?');
        if ($q===false) return $matches[1]."?$url_modifier";
        if ($q==strlen($matches[2])-1) return $matches[1].$url_modifier;
        return $matches[1]."&$url_modifier";
    },
    $html);
  • 写回答

1条回答 默认 最新

  • drpp5680 2017-10-23 09:22
    关注

    once detected the urls you can use parse_url() and parse_str() to elaborate the url, add utm and medium and rebuild it without caring too much about the content of the get parameters or the hash:

    $url_modifier_domain = preg_quote('add-link.com');
    
    $html_text = preg_replace_callback(
        '#((?:https?:)?//'.$url_modifier_domain.'(/[^\'"\#]*)?)(?=[\'"\#])#i',
        function ($matches) {
            $link = $matches[0];
            if (strpos($link, '#') !== false) {
                list($link, $hash) = explode('#', $link);
            }
            $res = parse_url($link);
    
            $result = '';
            if (isset($res['scheme'])) {
                $result .= $res['scheme'].'://';
            }
            if (isset($res['host'])) {
                $result .= $res['host'];
            }
            if (isset($res['path'])) {
                $result .= $res['path'];
            }
            if (isset($res['query'])) {
                parse_str($res['query'], $res['query']);
            } else {
                $res['query'] = [];
            }
    
            $res['query']['utm'] = 'some';
            $res['query']['medium'] = 'stuff';
    
            if (count($res['query']) > 0) {
                $result .= '?'.http_build_query($res['query']);
            }
            if (isset($hash)) {
                $result .= '#'.$hash;
            }
    
            return $result;
        },
        $html
    );
    

    As you can see, the code is longer but simpler

    Edit I made some change, searching for every href="xxx" inside the text. If the link is not from add-link.com the script will skip it, otherwise he will try to print it in the best way possible

    $html = 'blabla <a href="http://add-link.com/">a</a>
    <a href="http://add-link.com/">a</a>
    <a href="http://add-link.com/#hashed">a</a>
    <a href="http://abcd.com/#hashed">a</a>
    <a href="http://add-link.com/?test=1">a</a>
    <a href="http://add-link.com/try.php">a</a>
    <a href="http://add-link.com/try.php?test=1">a</a>
    <a href="http://add-link.com/try.php#hashed">a</a>
    <a href="http://add-link.com/try.php?test=1#hashed">a</a>
    <a href="http://add-link.com/try.php?test=1#hashed">a</a>
    <a href="//add-link.com?test=test" style="color: rgb(198, 156, 109);">a</a>
    ';
    
    $url_modifier_domain = preg_quote('add-link.com');
    
    $html_text = preg_replace_callback(
        '/href="([^"]+)"/i',
        function ($matches) {
            $link = $matches[1];
    
        // ignoring outer links
        if(strpos($link,'add-link.com') === false) return 'href="'.$link.'"';
    
            if (strpos($link, '#') !== false) {
                list($link, $hash) = explode('#', $link);
            }
            $res = parse_url($link);
    
            $result = '';
            if (isset($res['scheme'])) {
                $result .= $res['scheme'].'://';
            } else if(isset($res['host'])) {
           $result .= '//';
        }
    
            if (isset($res['host'])) {
                $result .= $res['host'];
            }
            if (isset($res['path'])) {
                $result .= $res['path'];
            } else {
            $result .= '/';
        }
    
            if (isset($res['query'])) {
                parse_str($res['query'], $res['query']);
            } else {
                $res['query'] = [];
            }
    
            $res['query']['utm'] = 'some';
            $res['query']['medium'] = 'stuff';
    
            if (count($res['query']) > 0) {
                $result .= '?'.http_build_query($res['query']);
            }
            if (isset($hash)) {
                $result .= '#'.$hash;
            }
    
            return 'href="'.$result.'"';
        },
        $html
    );
    
    var_dump($html_text);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输