2015-04-02 1 views
1

Я один пример строки следующим образом:PHP 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/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\" />"; 

(Прости меня за синтаксических ошибок, как размещение одиночных и двойные кавычки)

Для справки I 'только что добавили три тега <img>, но в реальной ситуации эта строка может содержать один тег <img> или не тег <img> или более одного знака <img>.

Я хочу получить имена файлов, присутствующих в каждом атрибуте src тега <img>, и создать массив этих имен файлов. Затем я должен заменить теги <img> строками из массива под названием $emoticon_codes, который создается динамически на основе имени файла, присутствующего в теге <img>. Такая замена строк должна происходить в том же порядке.

Для этого я пробовал следующий код. До создания динамического массива под названием $emoticon_codes все работает отлично, но я столкнулся с кодом для замены текущих тегов <img> строками из массива $emoticon_codes. Так может кто-нибудь, пожалуйста, помогите мне в исправлении ошибки, которую я делаю в своем коде, заменяя теги <img> из строки.

Ниже мой код:

$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; 
     } 
    } 
    } 

Моя требуемая последовательность вывода должна быть как следует за echo $feed_status;:

$ feed_status = Рад видеть вас снова \ ue056 \ ue056 \ ue056 ;

Заранее спасибо.

ответ

3

Если вы пытаетесь изменить несколько детей, вам нужно некоторое regression внести некоторые изменения, и я предлагаю попытаться сопоставить каждый замены в массиве вместо того, мультипликатор, если заявления. Пример:

$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; 

Sample Output

+0

Большое вам спасибо за вашу огромную помощь. Он отлично работал для меня. Еще раз спасибо от всего сердца. – user2839497

+1

@ user2839497 уверен, что я рад, что это помогло – Ghost

0

У вас есть это:

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

Однако это только петли через $imageTags, не $emoticon_codes.

Вам нужно это:

foreach($imageTags as $img) { 
     foreach($emoticon_codes as $emoticon_code) { 
       $img->parentNode->replaceChild($img, $doc->createTextNode($emoticon_code)); 
     } 
} 
+0

Еще та же самая проблема. В моем коде я использую каждый элемент из массива $ emoticon_codes, используя переменную $ t, и я инициализирую и увеличиваю ее один на каждую итерацию. Должна быть другая проблема. – user2839497