Luk*_*een 4 php encode urlencode rfc domdocument
使用DOMDocument(),我正在替换a中的链接$message并添加一些东西,比如[@MERGEID].当我保存更改时$dom_document->saveHTML(),链接得到"排序"的url编码.[@MERGEID]成为%5B@MERGEID%5D.
稍后在我的代码中,我需要[@MERGEID]用ID 替换.所以我搜索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
Run Code Online (Sandbox Code Playgroud)
我相信这两种编码有不同的用途.urlencode()编码"要在 URL 的查询部分中使用的字符串",同时$element->setAttribute('href', $newlink);对要用作URL的完整URL进行编码.
例如:
urlencode('http://www.google.com'); // -> http%3A%2F%2Fwww.google.com
Run Code Online (Sandbox Code Playgroud)
这对编码查询部分很方便,但不能使用它<a href='...'>.
然而:
$element->setAttribute('href', $newlink); // -> http://www.google.com
Run Code Online (Sandbox Code Playgroud)
将正确编码字符串,以便它仍然可用href.它无法编码的原因是@因为它无法判断是否@是查询的一部分或者它是userinfo或emailurl的一部分(例如:mailto:invisal@google.com或invisal@127.0.0.1)
[@MERGEID]您可以使用,而不是使用@@MERGEID@@.然后,您稍后将其替换为您的ID.此解决方案不需要您甚至使用urlencode.
如果你坚持使用urlencode,你可以使用%40而不是@.所以,你的代码将是这样的$newlink = 'http://www.example.com/click/[%40MERGEID]?url=' . $link;
你也可以这样做 $newlink = 'http://www.example.com/click/' . urlencode('[@MERGEID]') . '?url=' . $link;
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |