Php 使用DOMDocument更改小胡子模板中链接的href

Php 使用DOMDocument更改小胡子模板中链接的href,php,html,domdocument,mustache,Php,Html,Domdocument,Mustache,当我尝试使用DOMDocument更改小胡子模板中链接的href时,我遇到了一个问题 考虑以下代码: $template = "<a href='{{url}}'>Link</a>"; $document = new DOMDocument(); $document->loadHTML($template, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOXMLDECL); fo

当我尝试使用DOMDocument更改小胡子模板中链接的href时,我遇到了一个问题

考虑以下代码:

$template = "<a href='{{url}}'>Link</a>";

$document = new DOMDocument();
$document->loadHTML($template, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOXMLDECL);

foreach ($document->getElementsByTagName('a') as $link) $link->setAttribute('href', 'https://myurl.com?redirect=' . $link->getAttribute('href'));

$template = $document->saveHTML();
echo $template; // <a href='https://myurl.com?redirect=%7B%7Burl%7D%7D'>Link</a>
$template=”“;
$document=新的DOMDocument();
$document->loadHTML($template,LIBXML\u HTML\u noimpled | LIBXML\u HTML\u NODEFDTD | LIBXML\u NOXMLDECL);
foreach($document->getElementsByTagName('a')作为$link)$link->setAttribute('href','https://myurl.com?redirect='.$link->getAttribute('href');
$template=$document->saveHTML();
echo$template;//
如果以后我尝试通过mustache呈现这个,我将无法使用ofc,因为
{{}}
部分是经过编码的。有没有办法告诉DOMDocument停止自动验证我的href属性?或者有没有其他方法可以让我轻松地获取html字符串,找到其中的所有
元素,并更改它们的
href
属性


编辑:显然,这是一个简单的例子,在我的现实生活场景中,我不可能用小胡子预渲染HTML,然后替换链接。

理论上,您正在查找href='{{url}}'的所有实例,并且希望用href='url}替换它们https://myurl.com?redirect={{url}}。用正则表达式和preg_替换就很简单了

以下是搜索字符串的初稿:

/(?<=href=')()(?={{url}}.*>)/
然后,此php代码将执行替换:

<?php

$sampleString = "<a href='{{url}}'>Link</a>

<p>This text {{url}} will not get replaced</p>

<a href='{{url}}' download='true'>Another Link</a>"; 

$regex = "/(?<=href=')()(?={{url}}.*>)/"; 

$replaced = preg_replace($regex, "https://myurl.com?redirect=\1", $sampleString); 

echo $replaced;

the
{{url}}
只是一个例子。顺便说一句,我知道我可以用regexp来实现这一点,但我正在寻找更可靠的东西,这就是为什么我要研究dom操作。@AdamBaranyai简化了mustache标记的严格性。。。
<?php

$sampleString = "<a href='{{url}}'>Link</a>

<p>This text {{url}} will not get replaced</p>

<a href='{{url}}' download='true'>Another Link</a>"; 

$regex = "/(?<=href=')()(?={{url}}.*>)/"; 

$replaced = preg_replace($regex, "https://myurl.com?redirect=\1", $sampleString); 

echo $replaced;