Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_replace i tagi html
Forum PHP.pl > Forum > PHP
Andrzej20
Hej,

Jestem na ukończeniu mechanizmu wyszukiwarki na swojej stronie, ale utknąłem przy podświetlaniu wyszukiwanych słów. Tzn. wszystko jest dobrze, dopóki jakiś cwaniak nie będzie próbował wyszukać słowa będącego atrybutem jakiegoś tagu html, np. "title", ponieważ w bazie trzymam w przeszukiwanych polach cały html.

W związku z tym, chcę przerobić użytego przeze mnie preg_replace'a tak, aby podświetlane były tylko słowa które nie znajdują się pomiędzy "<", a ">". Chyba dobrze rozumuję? winksmiley.jpg

Poniżej kawałek kodu z moim aktualnym preg_replace'm. Czy ktoś wie jak powinno brzmieć to wyrażenie, żeby działało tak jak wspomniałem wyżej?

  1. <?php
  2. $posts = preg_replace("/($phraseToHighlight)/i", '<span class="highlight">1</span>', $posts);
  3. ?>
behu
może strip_tags" title="Zobacz w manualu PHP" target="_manual i dopiero podświetlanie?

  1. <?php
  2. $posts = preg_replace("/($phraseToHighlight)/i", '<span class="highlight">1</span>', strip_tags($posts));
  3. ?>
szagi3891
  1. <?php
  2. $dane = '
  3. <html>
  4. <head>
  5.    <title class="cos">moja super strona - wyniki wyszukiwania cos</title>
  6. </head>
  7. <body>
  8.  
  9. <div> cos kskk sadasd <b>dasdas cos </b> </div>
  10. <p id="cos">cos</p>cos
  11. </body>
  12. </html>
  13. ';
  14.  
  15. $szukane_slowo = 'cos';
  16.  
  17. $dane = preg_replace_callback('#(<body>)(.*)(</body>)#si', fun_1, $dane);
  18.  
  19. function fun_1($arg) {
  20.    
  21.    $arg[2] = preg_replace_callback('#(<[^<>]*>)([^<>]*)#si', fun_2, $arg[2]);
  22.    
  23.    return $arg[1] . $arg[2] . $arg[3];
  24.    }
  25.  
  26. function fun_2($arg) {
  27.    
  28.    global $szukane_slowo;
  29.    
  30.    //$arg[2] = str_replace($szukane_slowo, '<span class="highlight">' . $szukane_slowo . '</span>', $arg[2]);
  31.    $arg[2] = str_replace($szukane_slowo, '<font color="red">' . $szukane_slowo . '</font>', $arg[2]);
  32.    
  33.    return $arg[1] . $arg[2];
  34.    }
  35.  
  36. print $dane;
  37. ?>


Uruchom sobie ten przykład. Oczywiście niechlujnie ten kod jest napisany, chodziło mi wyłącznie o zaprezentowanie funkcji preg_replace_callback która została użyta. Najpierw wyszukiwany jest teks który znajduje się pomiędzy znacznikami <body>..</body> a następnie wyszukiwana jest każda para tekstu <znacznik>tekst a na samym końcu dopiero za pomocą standardowej funkcji str_replace podmieniany jest "tekst" na <wyroznienie>tekst</wyroznienie>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.