0

我有一个包含多个 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 它们,并将它们放回原始字符串中。

编辑:为了清楚起见,我不是在寻求重定向部分的帮助,只是在有时有 http 时如何替换大字符串中的多个 URL

4

2 回答 2

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;
    }
}
于 2013-01-20T22:41:39.737 回答
1

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

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

可能您想添加一些过滤器来排除内部 URL。您可以在 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);
?>
于 2013-01-20T22:54:54.983 回答