Как проверить и заменить & lt; img & gt; теги, присутствующие в строке HTML с кодами смайликов в PHP?

Я хочу передать строку 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».

0

Решение

Я считаю, что проблема в том, как вы установите свой опции в 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector