PHP DOMDocument用文本节点替换多个子节点

PHP DOMDocument用文本节点替换多个子节点,php,html,domdocument,Php,Html,Domdocument,我有一个示例字符串,如下所示: $feed_status = "Nice to see you all back again <img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" /><img src=\"http://52.1.47.143/file/pic/emoticon/default/smi

我有一个示例字符串,如下所示:

$feed_status = "Nice to see you all back again <img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" /><img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" /><img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" />";
echo$feed_status之后,我想要的输出字符串应该如下所示

$feed\u status=很高兴再次见到大家\ue056\ue056\ue056

提前感谢。

您有:

  $doc = new DOMDocument();
  $doc->loadHTML($feed_status);
  $imageTags = $doc->getElementsByTagName('img');

  if(count($imageTags)) {
    $emoticon_codes = array();
    foreach($imageTags as $tag) {
      if (basename($tag->getAttribute('src')) == 'evilgrin.png') {
        array_push($emoticon_codes, '\ue404');
      }
      if (basename($tag->getAttribute('src')) == 'grin.png') {
        array_push($emoticon_codes, '\ue415');
      }
      if (basename($tag->getAttribute('src')) == 'happy.png') {
        array_push($emoticon_codes, '\ue057');
      }
      if (basename($tag->getAttribute('src')) == 'smile.png') {
        array_push($emoticon_codes, '\ue056');
      }
      if (basename($tag->getAttribute('src')) == 'surprised.png') {
        array_push($emoticon_codes, '\ue107');
      }
      if (basename($tag->getAttribute('src')) == 'tongue.png') {
        array_push($emoticon_codes, '\ue105');
      }
      if (basename($tag->getAttribute('src')) == 'unhappy.png') {
        array_push($emoticon_codes, '\ue403');
      }
      if (basename($tag->getAttribute('src')) == 'waii.png') {
        array_push($emoticon_codes, '\ue407');
      }
      if (basename($tag->getAttribute('src')) == 'wink.png') {
        array_push($emoticon_codes, '\ue405');
      }
    }
    /*Till here everything works fine. The array $emoticon_codes is also getting generated finely*/

    /*Following is the code giving problem to me,*/
    $t = 0;

    foreach($imageTags as $img) {
      $img->parentNode->replaceChild($img, $doc->createTextNode($emoticon_codes[$t]));
      $t++;
      if ($t > count($emoticon_codes)) {
        break;
      }
    }
  }
但是,它仅循环通过
$imageTags
,而不是
$emoticon\u code

你需要这个:

foreach($imageTags as $img) {
  $img->parentNode->replaceChild($img, $doc->createTextNode($emoticon_codes[$t]));
  $t++;
  if ($t > count($emoticon_codes)) {
    break;
  }
}

如果您试图更改多个子项,则需要一些子项来进行一些更改,我建议尝试将每个替换项映射到一个数组中,而不是使用多个If语句。例如:

foreach($imageTags as $img) {
      foreach($emoticon_codes as $emoticon_code) {
              $img->parentNode->replaceChild($img, $doc->createTextNode($emoticon_code));
      }
}
$feed\u status=“很高兴再次见到你们”;
$doc=新的DOMDocument();
@$doc->loadHTML($feed_status,LIBXML_HTML_NOIMPLIED,LIBXML_HTML_NODEFDTD);
$imageTags=$doc->getElementsByTagName('img');
$replacements=数组(
'evilgrin.png'=>'\ue404',
'grin.png'=>'\ue415',
'happy.png'=>'\ue057',
'smile.png'=>'\ue056',
'惊奇.png'=>'\ue107',
'tangle.png'=>'\ue105',
'unhappy.png'=>'\ue403',
'waii.png'=>'\ue407',
'wink.png'=>'\ue405',
);
//回归
$i=$imageTags->length-1;
而($i>-1){
$tag=$imageTags->item($i);
$basename=basename($tag->getAttribute('src'));
if(isset($replacements[$basename]){//如果文件名匹配
//替换
$r=$replacements[$basename];
$text=$doc->createTextNode($r);
$tag->parentNode->replaceChild($text,$tag);
}
$i--;
}
//再次追加到字符串容器
$feed_status='';
foreach($doc->childNodes->item(0)->childNodes作为$e){
$feed_status.=$doc->saveHTML($e);
}
echo$feed_状态;

还是一样的问题。在我的代码中,我通过使用变量$t使用数组$emoticon_代码中的每个元素,并且每次迭代都初始化并增加一个元素。肯定还有其他问题。非常感谢您的大力帮助。它对我非常有效。再次衷心感谢。@user2839497当然,我很高兴这有帮助
$feed_status = "Nice to see you all back again <img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" /><img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" /><img src=\"http://52.1.47.143/file/pic/emoticon/default/smile.png\" alt=\"Smile\" title=\"Smile\" title=\"v_middle\" />";

$doc = new DOMDocument();
@$doc->loadHTML($feed_status, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$imageTags = $doc->getElementsByTagName('img');

$replacements = array(
    'evilgrin.png' => '\ue404',
    'grin.png' => '\ue415',
    'happy.png' => '\ue057',
    'smile.png' => '\ue056',
    'surprised.png' => '\ue107',
    'tongue.png' => '\ue105',
    'unhappy.png' => '\ue403',
    'waii.png' => '\ue407',
    'wink.png' => '\ue405',
);

// regression 
$i = $imageTags->length - 1;
while($i > -1) {
    $tag = $imageTags->item($i);
    $basename = basename($tag->getAttribute('src'));
    if(isset($replacements[$basename])) { // if the file name matches
        // make replacements
        $r = $replacements[$basename];
        $text = $doc->createTextNode($r);
        $tag->parentNode->replaceChild($text, $tag);
    }
    $i--;
}
// append to string container again
$feed_status = '';
foreach($doc->childNodes->item(0)->childNodes as $e) {
    $feed_status .= $doc->saveHTML($e);
}
echo $feed_status;