2013-04-21 182 views
9

我有一個html字符串,其中只包含一個元素。例如:用php修改html屬性

<a href="http://www.test.com" rel="nofollow external">test</a> 

在PHP一定要考,如果相對包含外部,如果是,則修改HREF和保存的字符串。

我查找了DOM節點和對象。但它們對於只有一個A元素似乎太多了,因爲我必須迭代以獲得html節點,並且我不確定如何測試是否存在幷包含外部

$html = new DOMDocument(); 
$html->loadHtml($txt); 
$a = $html->getElementsByTagName('a'); 
$attr = $a->item(0)->attributes(); 
... 

在這一點上,我將獲得NodeMapList似乎是開銷。有沒有更簡單的方法呢,還是應該用DOM來完成?

+0

當DOM處理,你有兩種選擇:1)使用本地DOM解析器2)使用正則表達式(這是開銷) – Yang 2013-04-21 01:47:28

+0

繼續前進。使用'DOMDocument()'進行操作 – Yang 2013-04-21 01:48:10

+0

沒有人應該使用原始DOM方法進行操作。考慮phpQuery或QueryPath等,以減少繁瑣的樣板。 – mario 2013-04-21 01:48:32

回答

9

有沒有更簡單的方法,或者我應該使用DOM?

用DOM做。

下面是一個例子:

<?php 
$html = '<a href="http://example.com" rel="nofollow external">test</a>'; 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$nodes = $xpath->query("//a[contains(concat(' ', normalize-space(@rel), ' '), ' external ')]"); 
foreach($nodes as $node) { 
    $node->setAttribute('href', 'http://example.org'); 
} 
echo $dom->saveHTML(); 
0

對你來說更容易(如jQuery JavaScript的),你可以使用正則表達式像 if it matches /\s+rel\s*=\s*".*external.*"/ 然後做一個正則表達式替換像 /(<a.*href\s*=\s*")([^"]\)("[^>]*>)/\1[your new href here]\3/

雖然使用可以做這樣的東西一庫

2

我一直在用DOM修改。這是我得到的:

$html = new DOMDocument(); 
$html->loadHtml('<?xml encoding="utf-8" ?>' . $txt); 
$nodes = $html->getElementsByTagName('a'); 
foreach ($nodes as $node) { 
    foreach ($node->attributes as $att) { 
     if ($att->name == 'rel') { 
      if (strpos($att->value, 'external')) { 
       $node->setAttribute('href','modified_url_goes_here'); 
      } 
     } 
    } 
} 
$txt = $html->saveHTML(); 

我不想爲這一個字符串加載任何其他庫。

2

最好的辦法是使用HTML解析器/ DOM,但這裏有一個正則表達式的解決方案:

$html = '<a href="http://www.test.com" rel="nofollow external">test</a><br> 
<p> Some text</p> 
<a href="http://test.com">test2</a><br> 
<a rel="external">test3</a> <-- This won\'t work since there is no href in it. 
'; 

$new = preg_replace_callback('/<a.+?rel\s*=\s*"([^"]*)"[^>]*>/i', function($m){ 
    if(strpos($m[1], 'external') !== false){ 
     $m[0] = preg_replace('/href\s*=\s*(("[^"]*")|(\'[^\']*\'))/i', 'href="http://example.com"', $m[0]); 
    } 
    return $m[0]; 
}, $html); 

echo $new; 

Online demo