2015-01-17 88 views
0

我正在尋找一種方式來改造這個:更換HTML標記的HREF

...<a href="showinfo:3875//[integer]">[inner content]</a>... 

進入這個:

...<a href="http://somelink.com/[inner content]">[inner content]</a>... 

的情況下有多個鏈接與其他showinfo:整數]值。 (我可以處理這些的)

感謝您的幫助, 巴林特

編輯:多虧了凱撒的答案,這裏是工作的代碼片段:

$html = $a; 

$dom = new \DOMDocument; 
@$dom->loadHTML($html); //Cannot guarantee all-valid input 

foreach ($dom->getElementsByTagName('a') as $tag) { 
    // Fixed strstr order and added a != false check - the, because the string started with the substring 
    if ($tag->hasAttribute('href') && strstr($tag->getAttribute('href'), 'showinfo:3875') != false) { 
     $tag->setAttribute('href', "http://somelink.com/{$tag->textContent}"); 
     // Assign the Converted HTML, prevents failing when saving 
     $html = $tag; 
    } 
} 
return $dom->saveHTML($dom); 
} 

回答

1

可以使用DOMDocument一個相當可靠的以及處理DOM節點及其屬性的快速方法等。提示:比(大多數)正則表達式快得多,也更可靠。現在,你有你的DOM準備

// Your original HTML 
$html = '<a href="showinfo:3875//[integer]">[inner content]</a>'; 

$dom = new \DOMDocument; 
$dom->loadHTML($html); 

,您可以使用該DOMDocument方法或DOMXPath通過它來搜索並獲得您的目標元素。

實施例使用XPath:

$xpath = new DOMXpath($dom); 
// Alter the query to your needs 
$el = $xpath->query("/html/body/a[href='showinfo:']"); 

或例如通過ID與DOMDocument方法:

// Check what we got so we have something to compare 
var_dump('BEFORE', $html); 

foreach ($dom->getElementsByTagName('a') as $tag) 
{ 
    if (
     $tag->hasAttribute('href') 
     and stristr($tag->getAttribute('href'), 'showinfo:3875') 
     ) 
    { 
     $tag->setAttribute('href', "http://somelink.com/{$tag->textContent}"); 

     // Assign the Converted HTML, prevents failing when saving 
     $html = $tag; 
    } 
} 

// Now Save Our Converted HTML; 
$html = $dom->saveHTML($html); 

// Check if it worked: 
var_dump('AFTER', $html); 

就這麼簡單。

+0

謝謝 - 效果很好! – molbal

+0

編輯:在問題中添加最終解決方案 – molbal

+0

@molbal關於您編輯的問題的一些註釋:您可能想使用'stristr()'(請參閱編輯答案)。你也不需要檢查'!= false'。忽略它是一樣的。但是,如果你這樣做,至少用'!=='做一個類型安全檢查。如果你**得到警告**,那麼請按照[這個答案](http://stackoverflow.com/questions/1148928/disable-warnings-when-loading-non-well-formed-html-by-domdocument-php/17559716#17559716)查看如何禁止警告。或者只是_fix_你的HTML,如果你在控制它:) – kaiser