2010-12-14 21 views
5

Quindi sto creando una funzione di ricerca per i commenti. Qualcun altro qui mi ha aiutato con lo SQL query. Quello che voglio anche fare è evidenziare il testo della query di ricerca nei risultati.PHP: evidenzia il testo da una stringa contenente HTML

I risultati vengono memorizzati come codice HTML all'interno di $variable. Come posso avvolgere il testo della query di ricerca all'interno di un tag <span>, ad esempio, senza rovinare l'html.

per es. la query di ricerca può essere foo bar e l'uscita può essere simile:

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

quindi dovrebbe essere qualcosa di simile:

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

risposta

2

Penso che questo è più complicato di quanto sembri. Se siamo alla ricerca di foo bar poi

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

sarà convertito in

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

ma per quanto riguarda alcuni casi particolari? Potrebbe essere che foo bar è abbinato all'interno di un tag HTML:

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

che sarà sostituito come

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

Ho ragione con questo? Non ho avuto a che fare con questo problema, ma ti consiglio di controllare i documenti di CakePHP (sì, so che non stai usando il framework--) in Text helper, il metodo highlight() che gestisce correttamente i tag HTML. Dai un'occhiata alla fonte, dagli un colpo e se funziona per te, vai avanti e copialo.

+1

sì, che possono verificarsi situazioni. Avrei dovuto menzionarlo nella domanda. comunque ho trovato una soluzione più semplice, usando 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

Se è assicurarsi che il termine di ricerca in sé non contiene alcun HTML, puoi andare dritto e avvolgerlo in "<span>" con l'aiuto di str_replace().

Si noti che questa è una delle rare occasioni in cui la gestione di HTML tramite le funzioni di stringa non è male di per sé.

Se il termine di ricerca può contenere codice HTML (ad esempio, l'evidenziazione può estendersi oltre i bordi del tag), le cose diventano molto più complicate e non si ottiene una scorciatoia intelligente come quella sopra.

+1

bene c'è un altro problema. per es. l'output può avere "", quindi il markup si interrompe .. – Alex

+0

@Alex: questo è vero, ed è proprio il motivo per cui l'uso della manipolazione di stringhe di base è generalmente considerato un no-no per lavorare con HTML. Dipende molto dai tuoi dati se questo approccio semplicistico è praticabile o meno. Se il commento può contenere * qualsiasi * HTML, ti trovi nell'angolo "molto più complicato" molto velocemente. – Tomalak

7

semplice trovare e sostituire:

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

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

+4

Non dimenticare che c'è anche una versione insensibile alle maiuscole ... str_ireplace – jocull

+0

bravo ... ho trovato –

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

Puoi usare il doppio cita anche loro, devi solo scapparli. Per maggiori informazioni - http://en.wikipedia.org/wiki/Escape_character – jolt

+0

grazie .. questo funziona come fascino per meee ... –

1

Ho avuto la stessa domanda, ma ho trovato this

Il codice è costruito per cambiare in modo casuale colori di evidenziazione, ma questo viene fatto attraverso una funzione, quindi è facile da modificare per utilizzare un solo colore:

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

Primo post!

0

text-shadow: 1px 1px 1px # FCD600;

Problemi correlati