Я хочу передать строку HTML, которая может содержать один или несколько <img>
теги и текст по выбору пользователя.
У меня есть один набор кодов смайликов в виде ассоциативного массива. Если любое имя файла из атрибута src любого <img>
тег, присутствующий в строке HTML, совпадает с любым из ключей, присутствующих в массиве эмодзи, затем <img>
тег должен быть заменен соответствующим кодом. Другие вещи, такие как текст и несоответствующие элементы, должны оставаться как есть.
Для достижения этого я попробовал приведенный ниже код, но я получаю пустое взамен от функции. Может кто-нибудь, пожалуйста, исправьте ошибку, которую я делаю в своем коде, или, если у вас есть какое-либо другое лучшее и эффективное решение этой проблемы, пожалуйста, дайте мне знать.
Если вы посмотрите на мою программу, я добавлю комментарии с выводом важных шагов.
<?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;
?>
В приведенном выше случае я хочу вывод как ‘\ Ue056 \ ue056 \ ue056’ так как все три <img>
теги содержат совпадающее имя файла в их src attribute
то есть smile.jpg так что все <img>
должен получить замену на код «\ ue056».
Я считаю, что проблема в том, как вы установите свой опции в loadHtml()
, + Изменить
$doc->loadHTML($feed_status, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
в
$doc->loadHTML($feed_status, LIBXML_HTML_NODEFDTD);
так как LIBXML_HTML_NOIMPLIED
отключает автоматическое добавление подразумеваемого html / body (ссылка), но ваш код использует $tag->parentNode
так что ваши фрагменты будут нуждаться в родительском теге.
После вышеуказанного изменения ваш скрипт выведет
\\ ue056 \\ ue056 \\ ue056
Замечания: Вы получите двойной слэш, потому что у вас есть
$feed_status .= addslashes($doc->saveHTML($e));
который добавит обратную косую черту в обратную косую черту в \ue056
(ссылка).
Замечания: HTML-фрагменты, такие как
<img src=".../smile.png" alt="Smile" title="Smile" title="v_middle" />
будет выдавать предупреждения при разборе, потому что у вас есть два атрибуты заголовка. Возможно, один из них должен быть классом?
Демо-версия: http://ideone.com/QRFUQm
Других решений пока нет …