2016-03-19 3 views
0

Ich habe folgenden HTML-Code in einer PHP-Variablen gespeichert:Wie HTML-Tags mit anderen Tags in einem PHP-Array ersetzt werden?

<p>This is a sample paragraph</p> 
    <img src="img/1.jpg"> 
<h1>This is my header</h1> 
    <img src="img/2.jpg"> 
<p>I hope someone can help me</p> 
    <img src="img/3.jpg"> 

Und ich habe einen PHP-Array, das drei Elemente aufweist, genau so viele wie die Bildelemente in dem HTML-String:

Array(3){ 
     [0]<img src="img/new1.jpg"> 
     [1]<img src="img/new2.jpg"> 
     [2]<img src="img/new3.jpg"> 
} 

Ich versuche eine Funktion zu schreiben, die das erste img-Tag in der HTML-Zeichenfolge durch das erste Array-Element ersetzt, das zweite mit dem zweiten im Array und das dritte mit dem dritten im Array. Damit ich am Ende dieses:

<p>This is a sample paragraph</p> 
    <img src="img/new1.jpg"> 
    <h1>This is my header</h1> 
    <img src="img/new2.jpg"> 
    <p>I hope someone can help me</p> 
    <img src="img/new3.jpg"> 

Glauben Sie mir, dass ich keine Ahnung habe, wie dies zu tun. Wenn ich eine Idee hätte, würde ich versuchen, aber das Problem ist, dass ich zu keiner Logik kommen kann, um dieses Problem zu lösen. Jede Hilfe wäre wirklich toll.

+0

Sie können Array neue Elemente ändern? – Naumov

+0

Die Anzahl der Bilder ist konstant 3 oder ändert sich das? –

+0

@ GyulaSoós Die Anzahl der Bild-Tags im HTML-String entspricht immer der Anzahl der Bild-Tags im Array. – DevMan

Antwort

2

Wenn Sie in der Lage Ihren neuen Bild-Tag-Array haben halten nur den Pfad/Info-Datei anstatt völlig neue HTML-Tags dann etwas ähnliches auf den folgende funktionieren soll:

$html = <<<'HTML' 
<p>This is a sample paragraph</p> 
    <img src="img/1.jpg"> 
<h1>This is my header</h1> 
    <img src="img/2.jpg"> 
<p>I hope someone can help me</p> 
    <img src="img/3.jpg"> 
HTML; 

$newImages = ['img/new1.jpg', 'img/new2.jpg', 'img/new3.jpg']; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$images = $dom->getElementsByTagName('img'); 

for ($i = 0; $i < $images->length; $i++) 
    $images->item($i)->setAttribute('src', $newImages[$i]); 

// Your updated HTML is now in $html  
$html = $dom->saveHTML(); 

Hinweis: Sie Sie können Ihr neues Bild-Array so ändern, dass nur Pfad/Bild verwendet wird, indem Sie preg_replace oder str_replace verwenden.

UPDATE AUF Ihre Antwort und ANTRAG AUF VERBESSERUNG AUF UNTER DER GRUNDLAGE:

  • ich das vergessen habe, mit meiner früheren Antwort aber ab PHP 5.4 und 2.6 Libxml, loadHTML() akzeptiert Libxml Parameter. Sie können alle str_replace() Sachen fallen lassen (siehe Code).
  • Es ist nicht notwendig, das Argument in eine lokale Variable zu kopieren, wenn $content eine einfache Zeichenfolge ist, da sie sowieso als Wert übergeben wird (das Original wird nicht geändert).
  • Ich würde Fehler nicht unter Verwendung @ unterdrücken, verwenden libxml_use_internal_errors und libxml_get_errors stattdessen, in diesem Fall.
  • Wie ich in meinem Kommentar erwähnt habe, sehe ich nicht $imagetag_arr wird an die Funktion übergeben, global erklärt, oder vor $this. Ich habe es der arg Liste der Funktion mit einem beschreibenden Namen hinzugefügt.

Aktualisiert Code:

function replaceTags($content, $newImages) 
{ 
    $dom = new DOMDocument(); 
    $dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

    $images = $dom->getElementsByTagName('img'); 

    for ($i = 0; $i < $images->length; $i++) 
    { 
     $dom2 = new DOMDocument(); 
     $dom2->loadHTML($newImages[$i]); 

     $newImg = $dom2->getElementsByTagName('img') 
         ->item(0); 

     $images->item($i)->setAttribute('src', $newImg->getAttribute('src')); 
    } 

    return $dom->saveHTML(); 
} 

2
$a=Array (
    'img/1.jpg'=>'img/new1.jpg', 
    'img/2.jpg'=>'img/new2.jpg', 
    'img/3.jpg'=>'img/new3.jpg'); 
$replace=array_values($a); 
$find=array_keys($a); 
$html=str_replace($find, $replace, $html); 

Wenn Sie auf einer höheren Ebene in dem HTML-Objektbaum ersetzen mögen, erhalten Sie einen Dom-Parser verwenden müssen, oder Probleme mit Größen wie laufen:

<img 
    src='img/1.jpg' 
> 
1

Try this :

$source = <<<'EOD' 
<p>This is a sample paragraph</p> 
    <img src="img/1.jpg"> 
<h1>This is my header</h1> 
    <img src="img/2.jpg"> 
<p>I hope someone can help me</p> 
    <img src="img/3.jpg"> 
EOD; 
$new = [ 
    '<img src="img/new1.jpg">', 
    '<img src="img/new2.jpg">', 
    '<img src="img/new3.jpg">', 
]; 
$i = 0; 
$result = preg_replace_callback(
    '/<img src="img\/[^.]+\.jpg">/', 
    function($matches) use ($new, &$i) { 
    return $new[$i++]; 
    }, 
    $source 
); 

Es ist getestet und es funktioniert.
Aber vielleicht könnte jemand eine elegantere Art der Verwendung von $new und $i finden?

+0

Dieser Code funktioniert mit einer Ausnahme. Alle Bild-Tags werden durch das erste Array-Element ersetzt. $ new [$ i ++] scheint nicht zu funktionieren. – DevMan

+0

@DevMan Oh ... Entschuldigung. Wie gesagt, es wurde getestet, aber ich konzentrierte mich darauf, "neu" zu prüfen, also habe ich nicht auf die Zahlen geachtet! Ich habe meine Antwort bearbeitet und jetzt ist mir klar, dass es funktioniert. – cFreed

-1

Vielen Dank an alle für Ihre Antworten. Ich habe irgendeine Art kombiniert alle Antworten und kam zu der folgenden Lösung. Es ist nicht das Beste aus der Coding-Perspektive und ich fühle mich schlecht wegen mir selbst, weil ich dieses "Amateur" -Skript geschrieben habe. Aber es funktioniert unter allen Bedingungen. Wenn jemand diesen Code verbessern könnte, wäre ich sehr dankbar.

$ Inhalt ist meine HTML-Zeichenfolge. $ imagetag_arr ist das Array mit den neuen Image-Tags.

function replaceTags($content){ 
     $html = $content; //content is my html string. 


     $dom = new DOMDocument; 
     $dom->loadHTML($html); 
     $images = $dom->getElementsByTagName('img'); 

     for ($i = 0; $i < $images->length; $i++) { 
      $dom2 = new DOMDocument(); 
      @$dom2->loadHTML($imagetag_arr[$i]); 
      $search = $dom2->getElementsByTagName('img'); 
      foreach ($search as $item) { 
       $newsrc=$item->getAttribute('src'); 
      } 
      $images->item($i)->setAttribute('src', $newsrc); 
     } 
    // my updated HTML is now in $html 

    $html = $dom->saveHTML(); 


     //because I've saved it as html now the dom object is appending all the html 
     //and body tags to my $final result so I've replaced 
     // them all with empty strings.I hate myself 
     // for doing it like this. 
     $finalhtml=preg_replace('/<![^>]+>/i','',$html); 
     $finalhtml=str_replace('<html>','',$finalhtml); 
     $finalhtml=str_replace('<body>','',$finalhtml); 
     $finalhtml=str_replace('</body>','',$finalhtml); 
     $finalhtml=str_replace('</html>','',$finalhtml); 

     return $finalhtml; 
    } 
+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contented-tags/1732454#1732454 – symcbean

+0

Was ist '$ imagetag_arr'? Ich sehe es nirgends definiert ... – avip

+0

@avip Sorry mein Schlechter. $ imagetag_arr ist das Array, gefüllt mit den neuen Image-Tags. Ich weiß nicht, warum jemand meine Antwort abgelehnt hat. Was stimmt damit nicht? – DevMan

Verwandte Themen