Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查和更换<;img>;在PHP中,HTML字符串中存在带有表情符号代码的标记?_Php_Html_Html Parsing_Domdocument_Emoji - Fatal编程技术网

如何检查和更换<;img>;在PHP中,HTML字符串中存在带有表情符号代码的标记?

如何检查和更换<;img>;在PHP中,HTML字符串中存在带有表情符号代码的标记?,php,html,html-parsing,domdocument,emoji,Php,Html,Html Parsing,Domdocument,Emoji,我想传递一个HTML字符串,该字符串可能包含一个或多个*/ $temp=$feed_状态; $doc=新的DOMDocument(); @$doc->loadHTML($feed_status,LIBXML_HTML_NOIMPLIED,LIBXML_HTML_NODEFDTD); $imageTags=$doc->getElementsByTagName('img'); /*打印($imageTags); echo PHP_EOL; 域节点列表对象 ( [长度]=>3 )*/ $replace

我想传递一个HTML字符串,该字符串可能包含一个或多个
*/
$temp=$feed_状态;
$doc=新的DOMDocument();
@$doc->loadHTML($feed_status,LIBXML_HTML_NOIMPLIED,LIBXML_HTML_NODEFDTD);
$imageTags=$doc->getElementsByTagName('img');
/*打印($imageTags);
echo PHP_EOL;
域节点列表对象
(
[长度]=>3
)*/
$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;
/*echo“i的值:”.$i.PHP\u EOL;
i的值:2*/
而($i>-1){
//echo“循环计数器:.$i.PHP\u EOL;
$tag=$imageTags->item($i);
/*打印(标签);
echo PHP_EOL*/
$basename=basename($tag->getAttribute('src'));
//echo$basename.PHP\u EOL;
循环中的if(isset($replacements[$basename]){//echo:“.$i.PHP\u EOL;
//如果文件名匹配,则进行替换
$r=$replacements[$basename];
//echo“r的值:”.$r.PHP\u EOL;
$text=$doc->createTextNode($r);
/*打印(文本);
echo PHP_EOL;*/
$tag->parentNode->replaceChild($text,$tag);
/*打印(标签);
echo PHP_EOL*/
}
$i--;
}
//我认为直到现在一切都很好,但问题在于保存这个新生成的HTML
//再次追加到字符串容器
$feed_status='';
foreach($doc->childNodes->item(0)->childNodes作为$e){
$feed_status.=addslashes($doc->saveHTML($e));
}   
如果($feed_status==''){
$feed\u status=带标签($temp);
}
返回$feed_状态;
}
$str_样本=“”;
$jumbo=string\u消毒液($str\u样本);
echo$jumbo;
?>

在上面的例子中,我希望输出为。\ue056\ue056\ue056',因为所有三个
,即smile.jpg,所以所有
都应该被替换为代码“\ue056”。

我认为问题在于如何设置
加载HTML()
。改变

<?php
  function string_sanitizer($feed_status) { 
    /*echo $feed_status.PHP_EOL;
<img src="http://54.174.50.242/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" /><img src="http://54.174.50.242/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" /><img src="http://54.174.50.242/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" />*/

    $temp = $feed_status;
    $doc = new DOMDocument();
    @$doc->loadHTML($feed_status, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    $imageTags = $doc->getElementsByTagName('img');
    /*print_r($imageTags);
      echo PHP_EOL;        
    DOMNodeList Object
    (
        [length] => 3
    )*/
    $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;
    /*echo "Value of i:".$i.PHP_EOL;
      Value of i:2*/     
    while($i > -1) { 
      //echo "Loop Counter :".$i.PHP_EOL;

      $tag = $imageTags->item($i);
      /*print_r($tag);
      echo PHP_EOL;*/
      $basename = basename($tag->getAttribute('src'));
      //echo $basename.PHP_EOL;
      if(isset($replacements[$basename])) { //echo "In a loop :".$i.PHP_EOL; 
        //if the file name matches make replacements
        $r = $replacements[$basename];
        //echo "Value of r : ".$r.PHP_EOL;
        $text = $doc->createTextNode($r);
        /*print_r($text);
        echo PHP_EOL;*/ 
        $tag->parentNode->replaceChild($text, $tag);
        /*print_r($tag);
        echo PHP_EOL;*/
      }
      $i--;
    }
    //I think till here everything works fine but issue is in saving this newly generated HTML

    // append to string container again
    $feed_status = '';
    foreach($doc->childNodes->item(0)->childNodes as $e) {
      $feed_status .= addslashes($doc->saveHTML($e));
    }   

    if($feed_status == '') {
      $feed_status = strip_tags($temp);        
    }
    return $feed_status;
  }

$str_sample = '<img src="http://54.174.50.242/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" /><img src="http://54.174.50.242/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" /><img src="http://54.174.50.242/file/pic/emoticon/default/smile.png" alt="Smile" title="Smile" title="v_middle" />';
$jumbo = string_sanitizer($str_sample);
echo $jumbo;
?>

因为
LIBXML\u HTML\u noimpled
关闭了隐含HTML/body()的自动添加,但是您的代码使用了
$tag->parentNode
,所以您的片段将需要一个父标记

在进行上述更改后,脚本将输出

\\ue056\\ue056\\ue056


注意:您将获得双斜杠,因为您有

$doc->loadHTML($feed_status, LIBXML_HTML_NODEFDTD);
将在
\ue056
()中的反斜杠中添加反斜杠


注意:HTML片段

$feed_status .= addslashes($doc->saveHTML($e));

解析时将抛出警告,因为您有两个标题属性。也许其中一个应该是班级



演示:

您的意思是返回值为空(
'
)?请确保
display\u errors
已打开且没有错误,好吗?@ofirbarch:是的,空表示“”。没有更多错误,即使您可以复制粘贴并在本地计算机上运行代码。实际上,代码应该可以工作,但我不明白问题出在哪里。我仍然得到一个空白字符串。在进行了您建议的更改后,该程序在我的本地计算机上也可以正常工作,但在我的系统中不起作用。当我在我的系统中运行相同的代码时,是否有可能由于某些配置文件/模块启用/禁用的更改而出现问题?首先,我很高兴它能为您工作。这现在是一个新问题。建议您在系统中启用错误报告,并查看报告的内容。可能有些XML模块没有安装。这些XML模块是什么?例如,如果一些XML模块没有安装:(但我们确实需要一个错误日志来确定)
$feed_status .= addslashes($doc->saveHTML($e));
<img src=".../smile.png" alt="Smile" title="Smile" title="v_middle" />