【问题标题】:PHP: replace relative urls to absolute urls in a textareaPHP:将相对网址替换为文本区域中的绝对网址
【发布时间】:2012-05-27 04:37:03
【问题描述】:

我想将相对 URL 替换为文本区域中的绝对 URL。所以是这样的:

/somefolder/somefile 

替换为:

http://www.mysite123.com/somefolder/somefile

我有这个替换功能来完成这项工作:

$replaceStrs = array('href=/', "href='/", 'href="/');
$datdescription = str_ireplace($replaceStrs, 'href="http://www.' . $domain . "/", $datdescription);
  1. 问题是它需要一个/ 在值的开头,因此像href=somefolder/somefile 这样的URL 不会被替换。
  2. 如果href 部分中的= 之前或/ 和之后有空格,我也希望它能够工作。

第 1 点是最重要的。你能帮忙改进一下吗?

我见过将相对 URL 替换为绝对 URL like this one 的 PHP 示例。

但要求是相对 URL 已知 / 找到但在我的情况下我没有管理这部分(我正在替换文本区域中的所有 URL)。

【问题讨论】:

  • 您的网址是否来自 bbcode/markdown 或类似的?还是纯 HTML?如果它是纯 HTML,我的答案应该有效。如果不是,则可能会缺少引号,具体取决于 urls 的 bbcode/markdown 语法。
  • 非常感谢 :-) 它是纯 HTML,没有降价 :-)

标签: php url relative-path absolute-path


【解决方案1】:

PHP:

function expand_links($link) {
    return('href="http://example.com/'.trim($link, '\'"/\\').'"');
}
$textarea = preg_replace('/href\s*=\s*(?<href>"[^\\"]*"|\'[^\\\']*\')/e', 'expand_links("$1")', $textarea);

我还更改了正则表达式以使用双引号或撇号。

【讨论】:

  • PCRE 意味着 perl 兼容...这意味着 JavaScript 和 PHP 兼容。我在使用 JavaScript 的 firebug 中测试了我的答案。现在它被重新格式化为 PHP。
  • 谢谢 :-) 我还需要它来处理不以“/”开头的相对网址,例如:preg_replace('/href\s*=\s*"([ ^"]*?)"/', $domain . '$1', 'href="folder/file.html"');
  • 正则表达式没有寻找斜线。它看起来 href 空间等于空间 anyquote
  • 谢谢 :-) 如何回显新的/替换的值?我的代码是:bold example.com'; // 注意域有一个斜线 $datdescription = "tester afadf adf page1 ... bla bla page2 bla bla...."; preg_match('/href\s*=\s*(?"[^"]*"|\'[^\']*\')/', $datdescription, $matches); $href = $ domain.trim($matches['href'], '\'"/'); // 如果从 href 中删除了结束斜线,则会发出警告 echo $datdescription; ?>**粗体**
  • 换句话说:如何回显新/替换的 textarea 值?
【解决方案2】:

当一个 PHP 函数已经可以为你做这件事时,为什么要大惊小怪?

http://php.net/manual/en/function.http-build-url.php

PS:它似乎只在 PECL 上可用。我刚刚测试了我的 Hostgator VPS(标准 CentOS 5 存储库)以及我的测试 WAMP 环境,它似乎在两者上都可用。

注意:另外,您真的不应该盲目地替换 HTML 片段。首先,它最终可能无法正常工作(编码问题),其次,它可能会给您的代码添加安全问题。

【讨论】:

  • 为了使用 http_build_url() 你首先需要拥有 url。
  • 我们正在谈论一个包含很好的文本区域...人们在文本区域中放置的内容...包括 HTML 链接我们必须提取出来进行处理。
  • 这里没有安全风险,因为我使用的是自己的域。问题是我有一个带有日历的域。然后我在另一个域上有另一个日历,我将一些事件转移到其中,但是相对 url 在“那里”不起作用(没有插入第一个域)。我非常愿意提供更简单的解决方案 :-D 你能帮忙举一个完整的例子吗?
  • Mihai Stancu - 嗯?他确实有 URL,他只是想构建一个。关于 HTML 解析部分,最好使用 DOM 或 XML 解析器来代替正则表达式。
  • Jens Kirk - 在这里使用自己的域无关紧要,如果人们可以注入 javascript/自定义 html 等,那你就完蛋了。您可以通过使用诸如 DOM 或 XML 解析之类的东西来降低风险,只获取您需要的信息(如 src/href 属性)并丢弃其余信息(onclick 等...一切)。
【解决方案3】:

我为你扩展了 Mihai Stancu 的答案!


<?php 
function expand_hrefs($link, $url) {
    return('href="http://'.$url.'/'.trim($link, '\'"/\\').'"');
}

function expand_srcs($link, $url) {
    return('src="http://'.$url.'/'.trim($link, '\'"/\\').'"');
}

$html = preg_replace('/href\s*=\s*(?<href>"[^\\"]*"|\'[^\\\']*\')/e', 'expand_hrefs("$1", "'.$url.'")', $html);
$html = preg_replace('/src\s*=\s*(?<src>"[^\\"]*"|\'[^\\\']*\')/e', 'expand_srcs("$1", "'.$url.'")', $html);
?>

这是我的第一个答案..

Stackoverflow.com 太棒了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多