2010-12-14 7 views
5

So mache ich eine Suchfunktion für Kommentare. Jemand anderes hier hat mir mit der SQL query geholfen. Was ich auch tun möchte ist, den Suchbegriff Text in den Ergebnissen hervorzuheben. Die Ergebnisse werden als HTML in einem $variable gespeichert. Wie kann ich den Suchabfragetext innerhalb eines Tags <span> zum Beispiel einwickeln, ohne das HTML zu verwirren.PHP - markieren Sie Text aus einer Zeichenfolge mit HTML

für zB. die Suchabfrage kann foo bar und die Ausgabe kann wie folgt aussehen:

<p>bla bla foo bar bla</p> 

so sollte es so etwas wie sein:

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

Antwort

2

Ich denke, das ist komplizierter als es aussieht. Wenn wir für foo bar der Suche werden dann

<p>bla bla foo bar bla</p> 

wird in

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

aber was einige Spezialfälle umgewandelt werden? Es könnte sein, dass foo bar innerhalb eines HTML-Tags angepasst ist:

<p>bla bla <span class="foo bar">foo bar</span> bla</p> 

die als

ersetzt werden
<p>bla <span class="<span class="highlight">foo bar</span>">foo bar</span> bla bla</p> 

Bin ich richtig mit diesem? Ich habe mich nicht mit diesem Problem beschäftigt, aber ich würde Ihnen empfehlen, die CakePHP-Dokumente (yeah, ich weiß, dass Sie nicht das Framework verwenden) im Text-Helper, der highlight()-Methode, die HTML-Tags richtig verarbeitet, zu überprüfen. Sieh dir die Quelle an, gib ihr eine Chance und wenn es für dich funktioniert, mach weiter und kopiere es.

+1

ja, dass Situationen auftreten können. Ich hätte das in der Frage erwähnen sollen. Wie auch immer, ich fand eine einfachere Lösung mit jQuery! : D – Alex

1
$searchString = 'foo bar'; 
$searchResult = '<p>bla bla foo bar bla</p>'; 

var_dump(str_replace($searchString, '<span>'.$searchString.'</span>', $searchResult)); 

var_dump(preg_replace('/'.$searchString.'/', '<span>'.$searchString.'</span>', $searchResult)); 
1

Wenn Sie sicherstellen, dass der Suchbegriff selbst enthält keine HTML, können Sie geradeaus gehen und es in "<span>" mit Hilfe von str_replace() wickeln.

Beachten Sie, dass dies einer der sehr seltenen Fälle ist, in denen der Umgang mit HTML über String-Funktionen nicht schlecht ist per se.

Wenn der Suchbegriff HTML enthalten kann (d. H. Das Highlight kann sich über Tag-Grenzen erstrecken), werden die Dinge viel komplizierter und Sie werden nicht mit einer cleveren Verknüpfung wie der oben genannten davonkommen.

+1

Nun, es gibt ein anderes Problem. für z. Die Ausgabe kann '' haben, dann bricht das Markup auf. – Alex

+0

@Alex: Dies ist wahr, und es ist genau der Grund, warum die Verwendung grundlegender Stringmanipulation im Allgemeinen als no-no für die Arbeit mit HTML angesehen wird. Es hängt viel von Ihren Daten ab, ob dieser simple Ansatz praktikabel ist oder nicht. Wenn der Kommentar * any * HTML enthalten kann, sind Sie in der "viel komplizierteren" Ecke sehr schnell. – Tomalak

7

Einfach finden und ersetzen:

$resultHTML = str_replace($searchString, '<span class="highlight">'.$searchString.'</span>', $resultHTML); 
+1

http://php.net/manual/en/function.str-replace.php –

+4

Vergessen Sie nicht, dass es eine case insensitive Version auch gibt ... str_ireplace – jocull

+0

gut eins ... ich fand –

2
<?php 

$result = "<p>Bla bla foo bar bla bla test x x x</p>"; 

$query = "foo bar"; 

// The important point here is, USE single quote (') in replacement part!! 
echo preg_replace("/($query)/", '<span class="highlight">${1}</span>', $result); 
+1

Sie können doppelt verwenden Zitate auch, muss nur entkommen. Für weitere Informationen - http://en.wikipedia.org/wiki/Escape_character – jolt

+0

danke .. das funktioniert wie Charme für meee ... –

1

hatte ich die gleiche Frage, aber ich fand this

Der Code gebaut wird zufällig Markierungsfarben zu ändern, aber dies wird durch eine Funktion durchgeführt, so ist es einfach, eine Farbe zu ändern, zu verwenden:

 $color = '#FCB514'; //self::generate_colors(); 

Erster Beitrag!

0

Text-Schatten: 1px 1px 1px # FCD600;

Verwandte Themen