如何检查和更换<;img>;在PHP中,HTML字符串中存在带有表情符号代码的标记?
我想传递一个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
*/
$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" />