2015-07-21 2 views
0

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')]"); 
//???? 

Я stucked между ними, я не знаю, как получить массив других якорных тегов, согласованных с anchor1.

ответ

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(); 
Смежные вопросы