重写字符串中的多个链接URL

时间:2013-01-20 21:36:45

标签: php preg-replace replace

我有一个包含多个HTML链接的长字符串,如下所示:

<a href="example.com">My Link></a>

<a href="http://example2.com">A different Link</a>

我需要在PHP中重写这些链接,以便通过我的重定向器发送流量,这样我就可以告诉用户他们现在要离开外部域等等。我的重定向器位于mydomain.com/leaving.php。我想要做的是将这些链接重写为:

<a href="http://www.mydomain.com/leaving.php/[URL ENCODED LINK FROM ABOVE]">My Link>

由于并非所有网址都以http://开头,我认为我需要先从所有href链接中删除这些网址。

如何grep正确的HTML链接(忽略图像src)和url_encode它们,并将它们放回原始字符串中。

编辑:只是为了澄清,我不是在寻找有关重定向部分的帮助,只是在有时候有一个大字符串的时候如何替换几个URL

2 个答案:

答案 0 :(得分:1)

这只是一个伪,你可以根据需要修改它。

首先需要一个.htaccess文件,该文件包含以下行;

RewriteEngine On
RewriteRule ^leaving/(.*)$ leaving.php?url=$1 [L]

并在leaving.php;

$url = trim(urldecode($_GET['url']));
// check url is exists
if ($url == '') {
    header('Location: http://www.mydomain.com/');
    exit;
}
// add http if needs
if (substr($url, 0, 7) != 'http://') {
    $url = 'http://'. $url;
}

// send it to target
header('Location: '. $url);
exit;

更新:

如果你在服务器端尝试这个,那就没用了,如果PHP发送一次输出,那么你就不能再使用preg's了。因此,如果想在客户端执行此操作,请遵循以下代码或类似内容来帮助您。

var links = document.getElementsByTagName("a"),
    link, href, i = 0;
while (link = links[i++]) {
    // get real url applying getAttribute with "2" params
    if ((href = link.getAttribute("href", 2)) !== null
            // skip non-href links
            && href.charAt(0) !== "#") {
        // add http if not exists
        if (href.substring(0, 7) !== 'http://') {
            href = "http://"+ href
        }
        link.href = "http://www.mydomain.com/leaving/"+ href;
    }
}

答案 1 :(得分:1)

使用正则表达式编辑XML容易出错并且很笨拙,但是有一些方便的工具。

最简单的结束最可靠的编辑HTML的方法是使用DOM和XPath。找到所有链接并重写它们。

可能您想添加一些过滤器来排除内部网址。您可以在XPath查询中执行此操作(可能更优雅,更快,因为必须处理更少的结果)或foreach循环。

<?php
    $html = <<< HTML
<p>
<a href="example.com">My Link>
<a href="http://example2.com">A different Link</a>
</p>
HTML;

    $dom = new DOMDocument;
    $dom->loadHTML($html);

    // Find all anchor elements containing a href attribute
    $xpath = new DOMXPath($dom);
    $anchors = $xpath->query('//a[@href]');

    // Replace all href attributes with redirection url
    foreach ($anchors as $anchor)
        // Possibly filter internal URLs?
        $anchor->setAttribute('href', 'http://www.mydomain.com/leaving.php/'.urlencode($anchor->getAttribute('href')));

    // Save html with replaced links
    $newHtml = $dom->saveXml($dom->documentElement);
?>