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.
Сам разобрался, чтобы получить свой вывод.
$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();
Других решений пока нет …