更改php中的所有a href链接

更改php中的所有a href链接,php,preg-replace-callback,Php,Preg Replace Callback,目前正在做的事情,我需要添加UTM标签的所有链接,得到1/2的小问题,我不能弄清楚 这是我正在使用的代码,问题是如果链接获得了一个参数,比如?test=test,那么它拒绝添加utm标记 另一个问题是一个小问题,我不确定是否有必要更改,我不需要添加url,如果它在默认情况下向所有a href添加utm标记而不知道域名,那么它可能会很整洁 希望有人能帮助我,把我推向正确的方向 $url_modifier_domain = preg_quote('add-link.com'); $html_tex

目前正在做的事情,我需要添加UTM标签的所有链接,得到1/2的小问题,我不能弄清楚

这是我正在使用的代码,问题是如果链接获得了一个参数,比如?test=test,那么它拒绝添加utm标记

另一个问题是一个小问题,我不确定是否有必要更改,我不需要添加url,如果它在默认情况下向所有a href添加utm标记而不知道域名,那么它可能会很整洁

希望有人能帮助我,把我推向正确的方向

$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);

一旦检测到url,您就可以使用parse_url和parse_str来详细说明url,添加utm和medium并重建它,而不必太在意get参数或散列的内容:

$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
);
正如您所看到的,代码更长但更简单

编辑 我做了一些更改,搜索文本中的每一个href=xxx。如果链接不是来自add-link.com,脚本将跳过它,否则他将尝试以最佳方式打印它

$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);

您可能需要使用DOM而不是RegExp,您的代码做什么,不做什么?代码add's?utm=some&medium=stuff to url=add-link.com问题是如果url ex是add link.com?test=test,我需要它做add link.com?test=test&utm=some&medium=stufhi Roberto,如果url得到一个参数呢??例如,我有一个名为add link.com?test=test的url,它完全忽略了这一点,不添加到它。$res['query']包含一个包含所有查询参数的数组,因此它们都不会丢失。我尝试过这个脚本,但是没有任何问题:,,它忽略了这个样式=颜色:rgb198,156,109;>弄清楚是什么触发了它,缺少的/ad是链接的结尾,如果是直接链接,可以添加一个简单的方法来确保在主链接之后添加/吗?这取决于你如何创建链接,如果它们是手写的,你可以创建另一个regexp来修复它,或者更改预览regexp以减少限制