2010-12-14 13 views
5

Więc robię funkcję wyszukiwania komentarzy. Ktoś inny pomógł mi z SQL query. Chcę również zaznaczyć tekst wyszukiwanego hasła w wynikach.PHP - podświetl tekst z łańcucha zawierającego HTML

Wyniki są przechowywane jako HTML wewnątrz $variable. W jaki sposób można zawinąć tekst kwerendy wyszukiwania w tagu <span> na przykład, bez zepsucia html.

dla np. wyszukiwane mogą być foo bar i wyjście może wyglądać następująco:

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

więc powinno być coś takiego:

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

Odpowiedz

2

myślę, że to jest bardziej skomplikowane niż wygląda. Jeśli szukamy foo bar następnie

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

zostanie przekształcony

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

ale co niektórych szczególnych przypadkach? Możliwe, że foo bar jest dopasowany wewnątrz znacznika HTML:

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

która zostanie zastąpiona jako

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

mam rację z tym? Nie byłem w tym problemie, ale polecam sprawdzanie dokumentów CakePHP (tak, wiem, że nie korzystasz z frameworka--) w Helperie tekstu, metodzie highlight(), która poprawnie obsługuje znaczniki HTML. Spójrz na źródło, daj mu szansę, a jeśli ci się uda, możesz je skopiować.

+1

tak, że mogą wystąpić sytuacje. Powinienem to wspomnieć w pytaniu. i tak znalazłem łatwiejsze rozwiązanie, używając jQuery! :RE – 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

Jeśli upewnisz się, że sam termin wyszukiwania nie zawierają żadnych HTML, możesz iść prosto i zawinąć go w "<span>" przy pomocy str_replace().

Należy zauważyć, że jest to jedna z bardzo rzadkich okazji, w których obsługa HTML za pomocą funkcji łańcuchowych nie jest zła per se.

Jeśli wyszukiwane hasło może zawierać HTML (tj. Podkreślenie może rozciągać się ponad granicami znaczników), rzeczy stają się znacznie bardziej skomplikowane i nie unikniesz sprytnego skrótu, takiego jak powyższy.

+1

cóż, jest inny problem. na przykład dane wyjściowe mogą mieć wartość '', a następnie znaczniki ulegają zniszczeniu. – Alex

+0

@Alex: To prawda, i właśnie dlatego używanie podstawowych operacji na łańcuchach jest ogólnie uważane za nie-nie dla pracy z HTML. To zależy bardzo od twoich danych, jeśli to uproszczone podejście jest wykonalne lub nie. Jeśli komentarz może zawierać * dowolny * HTML, jesteś w bardzo "skomplikowanym" rogu bardzo szybko. – Tomalak

7

Proste znaleźć i zastąpić:

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

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

+4

Nie zapominaj, że jest też wersja niewrażliwa na wielkość liter ... str_ireplace – jocull

+0

dobry ... znalazłem –

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

Możesz użyć podwójnie Cytaty też, po prostu muszę uciec 'em. Aby uzyskać więcej informacji - http://pl.wikipedia.org/wiki/Escape_character – jolt

+0

dzięki .. to działa jak urok dla mnie ... –

1

Miałem to samo pytanie, ale znalazłem this

Kod jest zbudowany na losowo zmieniać kolory podświetlenia, ale odbywa się to za pomocą funkcji, więc jest łatwy w modyfikacji, aby użyć jednego koloru:

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

Pierwszy post!

0

tekstowy cień: 1px 1px 1px # FCD600;

Powiązane problemy