2011-01-11 7 views
0

Ich habe ein tolles kleines Skript, das eine Datei suchen und eine Liste von Wörtern mit ihrem passenden Ersatzwort ersetzen wird. Ich habe auch einen Weg gefunden zu verhindern, dass preg_replace diese Wörter ersetzt, wenn sie in Anchor-Tags, img-Tags oder wirklich jedem Tag erscheinen, den ich spezifiziere. Ich möchte eine OR-Anweisung erstellen, um mehrere Tags angeben zu können. Um das klarzustellen, möchte ich verhindern, dass preg_replace Wörter ersetzt, die nicht nur in einem Anker-Tag erscheinen, sondern auch in einem Anker-, Link-, Embed-, Objekt-, IMG- oder Span-Tag. Ich habe versucht, das '|' ODER-Operator an verschiedenen Stellen im Code ohne Erfolg.PHP-Kodierung Preg_replace-Funktion von mehreren Tags einschränken

<?php 
$data = 'somefile.html'; 
$data = file_get_contents($data); 
$search = array ("/(?!(?:[^<]+>|[^>]+<\/a>))\b(red)\b/is","/(?!(?:[^<]+>|[^>]+<\/a>))\b(white)\b/is","/(?!(?:[^<]+>|[^>]+<\/a>))\b(blue)\b/is"); 
$replace = array ('Apple','Potato','Boysenberry'); 
echo preg_replace($search, $replace, $data);?> 
print $data; 
?> 

beim ersten Suchbegriff suchen, die im Grunde für „rot“ zu suchen, sagen aber nicht im Innern:

"/(?!(?:[^<]+>|[^>]+<\/a>))\b(red)\b/is" 

Ich versuche, wie ich irgendwie herauszufinden < \/Link hinzufügen>, < \/embed>, < \/Objekt>, < \/img> zu dieser Suche, so dass preg_replace in keinem dieser Tags 'rot' ersetzt.

+0

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

+0

Verwenden Sie stattdessen PHP-DOM-Klassen zum Durchlaufen eines HTML-Dokuments. – dqhendricks

Antwort

0

So etwas ?:

<?php 
    $file = 'somefile.html'; 
    $data = file_get_contents($file); 
    print "Before:\n$data\n"; 
    $from_to = array("red"=>"Apple", 
        "white"=>"Potato", 
        "blue"=>"Boysenberry"); 
    $tags_to_avoid = array("a", "span", "object", "img", "embed"); 
    $patterns = array(); 
    $replacements = array(); 

    foreach ($from_to as $from=>$to) { 
    $patterns[] = "/(?!(?:[^<]*>|[^>]+<\/(".implode("|",$tags_to_avoid).")>))\b".preg_quote($f 
rom)."\b/is"; 
    $replacements[] = $to; 
    } 

    $data = preg_replace($patterns, $replacements, $data); 

    print "After:\n$data\n"; 
    ?> 

Ergebnis:

Before: 
<a href="red.html">red</a> 
<span class="blue">red</span> 
blue<div class="blue">white</div> 
<div class="blue">red</div> 

After: 
<a href="red.html">red</a> 
<span class="blue">red</span> 
Boysenberry<div class="blue">Potato</div> 
<div class="blue">Apple</div> 
Verwandte Themen