2015-04-16 44 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

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