gpt4 book ai didi

php - DOMDocument->saveHTML() vs urlencode with commercial at symbol (@)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:02:39 27 4
gpt4 key购买 nike

使用 DOMDocument() ,我正在替换 $message 中的链接并添加一些内容,例如 [@MERGEID]。当我使用 $dom_document->saveHTML() 保存更改时,链接得到“某种” url 编码。 [@MERGEID] 变为 %5B@MERGEID%5D

稍后在我的代码中,我需要用 ID 替换 [@MERGEID]。所以我搜索 urlencode('[@MERGEID]') - 然而,urlencode()将符号 (@) 处的商业广告更改为 %40,而 saveHTML() 已将其保留。所以没有匹配 - '%5B@MERGEID%5D' != '%5B%40MERGEID%5D'

现在,我知道可以运行 str_replace('%40', '@', urlencode('[@MERGEID]')) 来获取在 $message 中定位合并变量所需的内容.

我的问题是,DOMDocument 使用的是什么 RFC 规范,为什么它与 urlencode 甚至 rawurlencode 不同?我能做些什么来保存 str_replace 吗?

演示代码:

$message = '<a href="http://www.google.com?ref=abc" data-tag="thebottomlink">Google</a>';
$dom_document = new \DOMDocument();
libxml_use_internal_errors(true); //Supress content errors
$dom_document->loadHTML(mb_convert_encoding($message, 'HTML-ENTITIES', 'UTF-8'));
$elements = $dom_document->getElementsByTagName('a');
foreach($elements as $element) {
$link = $element->getAttribute('href'); //http://www.google.com?ref=abc
$tag = $element->getAttribute('data-tag'); //thebottomlink
if ($link) {
$newlink = 'http://www.example.com/click/[@MERGEID]?url=' . $link;
if ($tag) {
$newlink .= '&tag=' . $tag;
}
$element->setAttribute('href', $newlink);
}
}
$message = $dom_document->saveHTML();
$urlencodedmerge = urlencode('[@MERGEID]');
die($message . ' and url encoded version: ' . $urlencodedmerge);
//<a data-tag="thebottomlink" href="http://www.example.com/click/%5B@MERGEID%5D?url=http://www.google.com?ref=abc&amp;tag=thebottomlink">Google</a> and url encoded version: %5B%40MERGEID%5D

最佳答案

我相信这两种编码有不同的用途。 urlencode()编码 "a string to be used in a query part of a URL" , 而 $element->setAttribute('href', $newlink);对要用作 URL 的完整 URL 进行编码。

例如:

urlencode('http://www.google.com'); // -> http%3A%2F%2Fwww.google.com

这对于编码查询部分很方便,但不能用于<a href='...'>。 .

但是:

$element->setAttribute('href', $newlink); // -> http://www.google.com

将正确编码字符串,以便它在 href 中仍然可用。 .它无法编码 @ 的原因因为它无法判断是否 @是查询的一部分还是 userinfo 的一部分或 email网址(例如:mailto:invisal@google.cominvisal@127.0.0.1)


解决方案

  1. 而不是使用 [@MERGEID] , 你可以使用 @@MERGEID@@ .然后,稍后用您的 ID 替换它。此解决方案甚至不需要您使用 urlencode .

  2. 如果你坚持使用urlencode ,您可以只使用 %40 而不是 @。所以,你的代码将是这样的 $newlink = 'http://www.example.com/click/[%40MERGEID]?url=' . $link;

  3. 您还可以执行类似 $newlink = 'http://www.example.com/click/' . urlencode('[@MERGEID]') . '?url=' . $link; 的操作

关于php - DOMDocument->saveHTML() vs urlencode with commercial at symbol (@),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302431/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com