XHTML:
<root>
<a href="1#fn1" class="fn-ref" id="s9781473910270.i11"><sup>1</sup></a>
<p>some text<a href="1#fnref1" id="s9781473910270.i237">↩</a></p>
</root>
从上面的示例中,如果两个锚点的href
相同(例如1#fn1
和1#fnref1
),则必须将ID's
作为href
进行交换并且必须使用fnref
将锚标记(其href
中包含<span class="label-fn">
)包裹起来,然后需要为该锚标记设置class="ref-fn-ref"
。
预期输出:
<root>
<a href="#s9781473910270.i237" class="fn-ref" id="s9781473910270.i11"><sup>1</sup>
</a>
<p>sometext<span class="label-fn"><a href="#s9781473910270.i11" class="ref-fn-ref"
id="s9781473910270.i237">↩</a></span></p>
</root>
到目前为止我已经尝试了,
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile("sample.xhtml", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$xp->registerNamespace("php", "http://php.net/xpath");
$className="fn-ref";
$anchor1 = $xp->query("//[contains(@class, '$className')]");
//????
我介入其间,我不知道如何获得与anchor1数组匹配的另一个锚标记的数组。
答案 0 :(得分:0)
弄清楚自己得到我的输出。
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$xp->registerNamespace("php", "http://php.net/xpath");
$a1 = $xp->query("//*[contains(@class, 'fn-ref')]");
$a2 = $xp->query("//*[contains(@href, '#fnref')]");
foreach($a1 as $a1v) {
$id1=$a1v->getAttribute('id');
preg_match("/([\\d]+)#fn([\\d+])/s",$a1v->getAttribute('href'),$m1);
$href1=$m1[1]."#fnref".$m1[2];
foreach($a2 as $a2v) {
if($a2v->getAttribute('href')===$href1){
$id2=$a2v->getAttribute('id');
$a2v->setAttribute('class','ref-fn-ref');
$a2v->setAttribute('href',"#".$id1);
$a1v->setAttribute('href',"#".$id2);
break;
}
}
}
$r=$dom->saveXML();