PHP str_replace更改链接路径

时间:2009-08-09 17:57:40

标签: php hyperlink replace

我正在使用file_get_contents来获取某些文件内容。到目前为止,这是有效的。但是我想在显示文件之前搜索文件并用<a href="替换所有<a href="site.php?url=。我怎样才能做到这一点?我知道我应该使用某种str_replace甚至preg_replace。但我不知道如何实际搜索并为我file_get_contents获得的文件执行此操作。

6 个答案:

答案 0 :(得分:4)

$text = file_get_contents('some_file');
$text = str_replace('<a href="', '<a href="site.php?url=', $text);

答案 1 :(得分:2)

file_get_contents返回包含文件内容的字符串。

所以,你可以使用你想要的任何字符串操作函数来处理这个字符串,就像你谈到的那样。

使用str_replace这样的事情可能会:

$content = file_get_contents('http://www.google.com');

$new_content = str_replace('<a href="', '<a href="site.php?url=', $content);

echo $new_content;

但请注意,当该属性是href代码的第一个属性时,它只会替换<a属性中的网址。

使用正则表达式可能可以帮助您更多;但它可能也不会完美,我害怕......

如果您正在处理HTML文档并想要一个“完整”解决方案,那么使用DOMDocument::loadHTML并使用DOM操作方法可能是另一个(更复杂,但可能更强大)解决方案。


根据您的意愿,这两个问题的答案也可能对您有所帮助:


看到评论后

编辑

如果要替换两个字符串,可以将数组传递给str_replace的两个第一个参数。例如:

$new_content = str_replace(
    array('<a href="', 'Pages'), 
    array('<a href="site.php?url=', 'TEST'), 
    $content);

有了这个:

  • '<a href="'将替换为'<a href="site.php?url='
  • 和“Pages”将替换为“TEST

并引用手册:

  

如果搜索和替换是数组,   然后str_replace()从中获取一个值   每个数组并使用它们进行搜索   并取代主题。如果更换   比搜索更少的值,然后是   空字符串用于其余部分   替换值。如果搜索是   然后,array和replace是一个字符串   这个替换字符串用于   每一个搜索价值。

如果您要替换“<a href="”的所有实例,那么它是str_replace默认执行的操作: - )

答案 2 :(得分:1)

$new_content = preg_replace('!(<a\s*[^>]*)href="([^"]+)"!','\1 href="site.php?url=\2"', $content);

我认为这应该可以解决问题:

  • 它取代了链接的href,无论它位于何处
  • e.g。适用于&lt; a href =“..”,&lt; a style =“”href =“...”

答案 3 :(得分:0)

如果您想在您的网站上使用远程文档但保持该文档的链接不变,请更好地使用BASE element来声明基本URI:

<base href="http://example.com/path/to/remote/document">

答案 4 :(得分:0)

就像bisko发送的代码一样,无论是封闭','还是href

$text = '<a href="http://www.europanet.com.br">Europanet</a>     <a target="_blank" href=\'http://www.webjump.com.br\'>Webjump</a>
<a id="link" href=http://www.euforia.com.br target="_top">Euforia</a>';
$text = preg_replace('|(<a\s*[^>]*href=[\'"]?)|','\1site.php?url=', $text);

答案 5 :(得分:0)

出于稳定性/可靠性的考虑,建议使用DOM解析器而不是正则表达式或基本的字符串替换函数,因为它们对DOM不了解。

这不是性能最高的解决方案,但是它干净,可读,易于维护并且很少出现故障。最终用户不太可能注意到性能下降。

下面的代码段是对this answer的改编。

没有调用preg_str_replace()函数。我使用Xpath过滤掉任何不需要的href匹配项。调用http_build_query()是生成编码的url查询字符串的一种干净方法。

代码:(Demo

$html = <<<HTML
<div>
    <img src="icons/example.svg">
    <a href="http://www.example.com">a link</a>
    <link href="css/example.css">
    <iframe src="http://www.example.com/default.htm"></iframe>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//a/@href') as $attr) {
    $attr->value = "site.php?" . http_build_query(['url' => $attr->value]);
}
echo $dom->saveHTML();

输出:

<div>
    <img src="icons/example.svg">
    <a href="site.php?url=http%3A%2F%2Fwww.example.com">a link</a>
    <link href="css/example.css">
    <iframe src="http://www.example.com/default.htm"></iframe>
</div>