我有一个包含多个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
答案 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);
?>