【发布时间】:2015-02-02 19:53:26
【问题描述】:
使用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&tag=thebottomlink">Google</a> and url encoded version: %5B%40MERGEID%5D
【问题讨论】:
-
这也是我感兴趣的。您是否尝试过按照手册使用 utf8_encode/decode 或 iconv?
-
@Kkinsey 在什么上运行 utf8_encode/decode 或 iconv?
-
没关系。我认为是我的错误。我再看看。
-
解释问题:为什么在使用
DOMDocument::saveHTML时DOMAttribute节点的值中没有对字符@进行百分比编码? -
一开始就对原始的 [@mergeid] 进行 urlencode 编码难道没有意义吗?然后您的搜索应该匹配而不需要 str_replace? $newlink = 'example.com/click/…' 。 $链接;
标签: php domdocument encode urlencode rfc