2015-04-16 75 views
2

我有以下代碼:更改特定DOM節點PHP

$item = "What I have: <a href='/id/blablabla'>This $oldtext.</a>"; 
$dom = new DOMDocument; 
$dom->loadHTML($item); 
foreach ($dom->getElementsByTagName('a') as $node) { 
    if(strpos($node->getAttribute('href'),'/id/') !== false) { 
     $oldtext = // ? 
     $newtext = "This is old:".$oldtext."And this is new: New."; 
     // then replace 'This $oldtext.' in $item as $newtext 
    } 
} 

此檢查是否在任何節點我$item具有包含/ ID /一個href。如果他們這樣做,他們應該保存當前文本,稱爲$oldtext的節點,然後用新文本替換文本,這將在新文本中使用$oldtext

編輯:我已經添加了什麼$項目看起來像清晰。

即使節點發生變化,如何保存$oldtext並更改節點本身?

+0

也許我不跟隨,但不能你只是做$ oldtext = $節點 - >的getAttribute( 'href' 屬性)? –

回答

0

如果你的意思它的文本節點,然後只需簡單訪問->nodeValue屬性。只是簡單地覆蓋它就像任何訪問對象屬性:

$item = "What I have: <a href='/id/blablabla'>This \$oldtext.</a>"; 
$dom = new DOMDocument; 
$dom->loadHTML($item); 
foreach ($dom->getElementsByTagName('a') as $node) { 
    if(strpos($node->getAttribute('href'),'/id/') !== false) { 
     $oldtext = $node->nodeValue; 
     $node->nodeValue = "This is old:".$oldtext."And this is new: New."; 
     // then replace 'This $oldtext.' in $item as $newtext 
    } 
} 
echo $dom->saveHTML(); 

Sample Output

+0

謝謝,這就是我一直在尋找的! – cappycap

+0

@cappycap當然很高興這有幫助 – Ghost

0

我認爲,所有你需要做的是,用$node->setAttribute('href', $newtext);替換的文本,然後通過做保存在最後的HTML:$dom->saveHTML();

請參見下面的完整例子:

$item = "What I have: <a href='/id/blablabla'>This $oldtext.</a>"; 
    $dom = new DOMDocument; 
    $dom->loadHTML($item); 
    foreach ($dom->getElementsByTagName('a') as $node) { 
     if(strpos($node->getAttribute('href'),'/id/') !== false) { 
      $oldtext = // ? 
      $newtext = "This is old:".$oldtext."And this is new: New."; 
      // then replace 'This $oldtext.' in $item as $newtext 
      $node->setAttribute('href', $newtext); 
     } 
    } 

    $dom->saveHTML(); 
+0

這是朝着正確的方向發展,但你的目標是錯誤的。基本上,我需要將標記的內部設置爲$ newtext,而不是與它關聯的href。 – cappycap

+0

我明白了。將更新答案。 –