2012-12-15 11 views
5

Ich habe HTML-Inhalt in einer Datenbanktabelle gespeichert. In diesem HTML-Inhalt möchte ich "SOME WORDS" durch ein Link-Tag ersetzen. Aber wenn "einige Worte" bereits in einem Link-Tag ist, sollte ich sie weglassen.PHP regulären Ausdruck, um "einige Wörter" mit einem Link-Tag zu ersetzen, sollte aber "einige Wörter" in Link-Tags ausschließen

z.B.
Der Inhalt

<p>Lorem ipsum dolor SOME WORDS, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p> 

sollte die Ausgabe

<p>Lorem ipsum dolor <a href="http://someurl">SOME WORDS</a>, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p> 

, wie Sie sehen können, sollten sie die bestehenden Linktexte aus, wenn sie zu ersetzen.

Einige Hinweise, um auf die richtige Spur zu kommen, werden sehr geschätzt.

+2

Sie nicht reguläre Ausdrücke verwenden, verwenden Sie einen HTML-Parser wie DOMDocument –

+0

Try - http://www.solmetra.com /scripts/regex/index.php - und - http://weblogtoolscollection.com/regex/regex.php - und ein paar andere Mist. – qooplmao

+1

Erinnerst du dich an das Mädchen aus dem Ring? Sie versuchte, auch reguläre Ausdrücke zu verwenden, um HTML zu verarbeiten und zu sehen, was mit ihr passiert ist! –

Antwort

3

Dies ist, wie Sie es mit DOMDocument anstelle von regulären Ausdrücken lösen könnte:

$contents = <<<EOS 
<p>Lorem ipsum dolor SOME WORDS, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p> 
EOS; 

$doc = new DOMDocument; 
libxml_use_internal_errors(true); 
$doc->loadHTML($contents); 
libxml_clear_errors(); 

$xp = new DOMXPath($doc); 

// find all text nodes 
foreach ($xp->query('//text()') as $node) { 
     // make sure it's not inside an anchor 
     if ($node->parentNode->nodeName !== 'a') { 
       $node->nodeValue = str_replace(
        'SOME WORDS', 
        'SOME OTHER WORDS', 
        $node->nodeValue 
       ); 
     } 
} 
// DOMDocument creates a full document and puts your fragment inside a body tag 
// So we enumerate the children and save their HTML representation 
$body = $doc->getElementsByTagName('body')->item(0); 
foreach ($body->childNodes as $node) { 
     echo $doc->saveHTML($node); 
} 
+0

danke .. das löste das Problem .. Ich dachte nicht über die Verwendung eines HTML-Parser .. – sanandrl

+0

Gern geschehen.HTML-Parser sind ein tolles Thema zum Lernen :) –

0

Dies sollte den Trick tun.

Überprüfen Sie einfach in der Regex wenn einige Worte von Tags

preg_replace('/[^>]SOME WORDS[^<]/','<a href="http://someurl">SOME WORDS</a>',$str); 
+2

das wird bei etwas wie brechen: here are SOME WORDS for you

1

Einfache Regex nur umgeben wird funktionieren, wenn es die genaue Phrase ist und innerhalb der Link ohne andere Symbole oder Worte. Sie könnten alle Vorkommen von SOME WORDS durchlaufen, um zu sehen, ob sie sich innerhalb eines Links befinden, indem Sie die Häufigkeit berechnen, mit der ein Link- und ein End-Link-Tag vor dem Auftreten aufgetreten sind. Versuchen Sie diesen Code:

$str = '<p>Lorem ipsum dolor SOME WORDS, consectetur adipiscing elit. <a href="http://example.com">SOME WORDS</a> elementum pharetra velit at cursus. Quisque blandit, nibh at eleifend ullamcorper</p>'; 
echo 'Before:' . $str; 
$str_lc = strtolower($str); 
$phrase = 'SOME WORDS'; 
$link = '<a href="http://someurl">SOME WORDS</a>'; 
$offset = 0; 
while($position = strpos($str, $phrase, $offset)) 
{ 
    if (substr_count($str_lc, "<a", 0, $position) <= substr_count($str_lc, "</a>", 0, $position)) { 
     $str = substr_replace($str, $link, $position, strlen($phrase)); 
     $str_lc = strtolower($str); 
     $offset = $position + strlen($link) - strlen($phrase); 
    } else { 
     $offset = $position + 1; 
    } 
} 
echo 'After:' . $str; 
1

Wenn Sie Platz haben für 3 Zeilen dies eine sichere Wette wäre:

$text=preg_replace('~<a(.*)(SOME WORDS)(.*)</a>~','<a$1PLACEHOLDER$3</a>',$text); 
$text=preg_replace('~SOME WORDS~','REPLACEMENT WORDS',$text); 
$text=preg_replace('~PLACEHOLDER~','SOME WORDS',$text); 

Es wird ein Platzhalter Text/Tag verwenden,/was auch immer, so dass Sie ersetzen nicht einen Link Inhalt (falls es einen gibt).

Verwandte Themen