2015-04-02 87 views
1

我有一個樣品字符串如下:PHP DOM文檔的文本節點替換多個孩子

$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\" />"; 

(請原諒我的語法錯誤,如單引號和雙引號的放置)

供您參考我我剛剛在字符串中添加了三個<img>標記,但在實際情況下,此字符串可能包含單個<img>標記或不包含<img>標記或多個<img>標記。

我想獲取每個<img>標記的src屬性中存在的文件的名稱並創建這些文件名的數組。然後,我必須用標題爲$emoticon_codes的數組中的字符串替換這些<img>標記,該數組是根據<img>標記中存在的文件名動態創建的。應該發生的字符串替換是相同的順序。

爲此我試了下面的代碼。直到創建動態數組標題爲$emoticon_codes一切都很好,但我面臨的代碼是用數組$emoticon_codes中的字符串替換當前的<img>標籤。那麼請有人可以幫我糾正我在代碼中犯的錯誤,同時替換字符串中的<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做出一些改變,我建議嘗試映射陣列中的每個替換而不是有多個if聲明。例如:

$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 2015-04-02 05:59:08

+1

@ user2839497確定我很高興這有幫助 – Ghost 2015-04-02 06:05:37

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

仍然是同樣的問題。在我的代碼中,我使用變量$ t使用數組$ emoticon_codes中的每個元素,並且每次迭代時我都會初始化並增加一個元素。必須有其他一些問題。 – user2839497 2015-04-02 05:26:28