Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Podświetlanie znalezionych fraz w wyniku wyszukiwania
Forum PHP.pl > Forum > Przedszkole
witosza
  1. <?php
  2. $text='abcd 123 Działalność abcd 123 działalność abcd 123 ';
  3. $klucze = array('dział');
  4.  
  5. function wyroznij($text,$klucze)
  6. {
  7.  
  8. foreach($klucze as $klucz)
  9. {
  10. $text=str_replace($klucz, '<strong>'.$klucz.'</strong>', $text);
  11. }
  12. return $text;
  13. }
  14.  
  15. echo wyroznij($text,$klucze);
  16. ?>


Wynik:
abcd 123 Działalność abcd 123 działalność abcd 123

Jak uzyskać podświetlenie wszystkich znalezionych fraz, czyli:
abcd 123 Działalność abcd 123 działalność abcd 123

Z góry bardzo dziękuję za pomoc.

P.S.
Znalazłem kilka rozwiązań na forum, lecz nie rozwiązują one mojego problemu sad.gif
skowron-line
wyszukiwarka

ja zrobilem cos takiego ale to jest w ajaxie jaka bedzie ci pasilo to moge wrzucic skrypt
witosza
Cytat(skowron-line @ 1.06.2007, 13:54:56 ) *
wyszukiwarka

ja zrobilem cos takiego ale to jest w ajaxie jaka bedzie ci pasilo to moge wrzucic skrypt



Dzięki, ale to jeszcze nie to. Twój skrypt rozróżnia wielkość liter, poza tym nie działa pod Firefox'em.
Tibod
  1. <?php
  2. if(!function_exists('str_ireplace')) {
  3.  function str_ireplace($search, $replacement, $string){
  4.  $delimiters = array(1,2,3,4,5,6,7,8,14,15,16,17,18,19,20,21,22,23,24,25,
  5.  26,27,28,29,30,31,33,247,215,191,190,189,188,187,186,
  6.  185,184,183,182,180,177,176,175,174,173,172,171,169,
  7.  168,167,166,165,164,163,162,161,157,155,153,152,151,
  8.  150,149,148,147,146,145,144,143,141,139,137,136,135,
  9.  134,133,132,130,129,128,127,126,125,124,123,96,95,94,
  10.  63,62,61,60,59,58,47,46,45,44,38,37,36,35,34);
  11.  foreach ($delimiters as $d) {
  12.  if (strpos($string, chr($d))===false){
  13.  $delimiter = chr($d);
  14.  break;
  15.  }
  16.  }
  17.  if (!empty($delimiter)) {
  18.  return preg_replace($delimiter.quotemeta($search).$delimiter.'i', $replacement, $string);
  19.  }
  20.  else { 
  21.  trigger_error('Homemade str_ireplace could not find a proper delimiter.', E_USER_ERROR);
  22.  }
  23.  }
  24. }
  25.  
  26. function podswietl($tekst, $szukane){
  27. $tekst=str_ireplace($szukane, '<SPAN STYLE="color: red; FONT-weight: bold;">'.$szukane.'</SPAN>', $tekst);
  28.  
  29. return $tekst;
  30. }
  31. ?>


Jeżeli używasz PHP w wersji 5 to pierwszą funkcję możesz wywalić.

Podświetlanie wywołujesz poprzez:
  1. <?php
  2. echo podswietl($miasto, $szukane);
  3. ?>
Sabistik
Tytuł tematu nie zgodny z regulaminem forum. W celu odblokowania topcu proszę wysłać mi go w poprawnej formie. Do tego czasu zamykam.

Otwarte.
witosza
Funkcja str_ireplace też nie rozwiązuje tego problemu, ponieważ zmienia wielkość liter w zwróconym tekście.
Szukam rozwiązania które nie rozróżnia wielkości liter podczas szukania,
natomiast w prezentowanym wyniku uwzględnia ich wielkość, np. wyszukiwarka google.


Cytat(Tibod @ 1.06.2007, 14:41:17 ) *
  1. <?php
  2. if(!function_exists('str_ireplace')) {
  3.  function str_ireplace($search, $replacement, $string){
  4.  $delimiters = array(1,2,3,4,5,6,7,8,14,15,16,17,18,19,20,21,22,23,24,25,
  5.  26,27,28,29,30,31,33,247,215,191,190,189,188,187,186,
  6.  185,184,183,182,180,177,176,175,174,173,172,171,169,
  7.  168,167,166,165,164,163,162,161,157,155,153,152,151,
  8.  150,149,148,147,146,145,144,143,141,139,137,136,135,
  9.  134,133,132,130,129,128,127,126,125,124,123,96,95,94,
  10.  63,62,61,60,59,58,47,46,45,44,38,37,36,35,34);
  11.  foreach ($delimiters as $d) {
  12.  if (strpos($string, chr($d))===false){
  13.  $delimiter = chr($d);
  14.  break;
  15.  }
  16.  }
  17.  if (!empty($delimiter)) {
  18.  return preg_replace($delimiter.quotemeta($search).$delimiter.'i', $replacement, $string);
  19.  }
  20.  else { 
  21.  trigger_error('Homemade str_ireplace could not find a proper delimiter.', E_USER_ERROR);
  22.  }
  23.  }
  24. }
  25.  
  26. function podswietl($tekst, $szukane){
  27. $tekst=str_ireplace($szukane, '<SPAN STYLE="color: red; FONT-weight: bold;">'.$szukane.'</SPAN>', $tekst);
  28.  
  29. return $tekst;
  30. }
  31. ?>


Jeżeli używasz PHP w wersji 5 to pierwszą funkcję możesz wywalić.

Podświetlanie wywołujesz poprzez:
  1. <?php
  2. echo podswietl($miasto, $szukane);
  3. ?>
skowron-line
Cytat(witosza @ 1.06.2007, 12:24:36 ) *
Twój skrypt rozróżnia wielkość liter, poza tym nie działa pod Firefox'em.

no i o to mi chodzilo
Cytat(witosza @ 1.06.2007, 12:24:36 ) *
poza tym nie działa pod Firefox'em.


questionmark.gif ja mam ff i jakos nie mam problemow
witosza
Nie do końca o to mi chodziło:
wyszukiwarka ma nie rozróżniać wielkości liter podczas szukania,
Twoja rozróżnia, poza tym chciałem ten problem rozwiązać za pomocą PHP a nie w technologii AJAX.

Cytat(skowron-line @ 4.06.2007, 14:02:03 ) *
no i o to mi chodzilo
questionmark.gif ja mam ff i jakos nie mam problemow
Kicok
W takim razie będziesz musiał to zrobić przy pomocy wyrażeń regularnych.

Przeanalizuj sobie to:
  1. <?php
  2.  
  3. $tekst = 'asf as gd test asf sdga gd Testgsdgd sdfTESTsadfsd TeStllltEsT sa
  4.  saf afs afsssf test asf af saTEST saf';
  5.  
  6.  
  7. $wyszukaj = 'test';
  8. $tekst = preg_replace( '/(' . preg_quote( $wyszukaj ) . ')/i', '<strong>$1</strong>', $tekst );
  9.  
  10. echo( $tekst );
  11.  
  12. ?>
witosza
W moim przypadku poszukiwane frazy są w tablicy i tu się sprawa komplikuje sad.gif
Jak zmodyfikować poniższy skrypt aby preg_replace zadziałał od razu na całej tablicy
Pętla foreach się nie sprawdziła, gdyż w przypadku tablicy np. $wyszukaj = array('test','s'),
skrypt znajdował literę "s" w dostawionym wcześniej znaczniku <strong>

Cytat(Kicok @ 13.06.2007, 17:04:53 ) *
W takim razie będziesz musiał to zrobić przy pomocy wyrażeń regularnych.

Przeanalizuj sobie to:
  1. <?php
  2.  
  3. $tekst = 'asf as gd test asf sdga gd Testgsdgd sdfTESTsadfsd TeStllltEsT sa
  4.  saf afs afsssf test asf af saTEST saf';
  5. $wyszukaj = 'test';
  6. $tekst = preg_replace( '/(' . preg_quote( $wyszukaj ) . ')/i', '<strong>$1</strong>', $tekst );
  7.  
  8. echo( $tekst );
  9.  
  10. ?>
Kicok
Musisz użyć alternacji w wyrażeniach regularnych. Wygląda to mniej więcej tak:
  1. <?php
  2.  
  3. $str = preg_replace( '/(test|foo|boo|s)/i', '<b>$1</b>', $str );
  4.  
  5. ?>


A oznacza mniej więcej: "znajdź test LUB foo LUB boo LUB s i wstaw znaleziony tekst w tagi <b></b>".
witosza
Wszystko pięknie, tylko tablica poszukiwanych fraz pochodzi z zapytania użytkowników,
dlatego nie jestem w stanie przewidzieć jakie i ile elementów będzie miała tablica.

Cytat(Kicok @ 14.06.2007, 21:26:10 ) *
Musisz użyć alternacji w wyrażeniach regularnych. Wygląda to mniej więcej tak:
  1. <?php
  2.  
  3. $str = preg_replace( '/(test|foo|boo|s)/i', '<b>$1</b>', $str );
  4.  
  5. ?>


A oznacza mniej więcej: "znajdź test LUB foo LUB boo LUB s i wstaw znaleziony tekst w tagi <b></b>".
Kicok
Widzisz jakiś problem w zamienieniu tablicy elementów na ciąg znaków: emelent1|element2|element3|element4 ? smile.gif
To wykonać można nawet przy pomocy implode" title="Zobacz w manualu PHP" target="_manual, jednak lepiej będzie składać ten ciąg w pętli, a każdy element tablicy najpierw potraktować funkcją preg_quote" title="Zobacz w manualu PHP" target="_manual
witosza
Faktycznie, masz rację, to rozwiązuje problem, temat uważam za zamknięty.
Wielkie dzięki za pomoc!

Cytat(Kicok @ 15.06.2007, 11:30:09 ) *
Widzisz jakiś problem w zamienieniu tablicy elementów na ciąg znaków: emelent1|element2|element3|element4 ? smile.gif
To wykonać można nawet przy pomocy implode" title="Zobacz w manualu PHP" target="_manual, jednak lepiej będzie składać ten ciąg w pętli, a każdy element tablicy najpierw potraktować funkcją preg_quote" title="Zobacz w manualu PHP" target="_manual
-kuba-
a co jak w szukanym tekscie jest np <img src="" height="" /> a ty szukasz "he"
wtedy sie rozsypie, jak zrobic zeby nie szukalo w img tagach?

ja zrobilem drugie pole w bazie z wyczyszczonymi tagami ale pewnie jest lepszy pomysl.

preg_math? ereg?
Kicok
W takim razie zrób alternację, która pierwsze sprawdzi czy w danym miejscu znajduje się tag HTML, a jeśli takowego nie znajdzie to dopiero wtedy sprawdzi, czy jest tam szukana wartość, np.:

  1. <?php
  2.  
  3.  
  4. function highlight( $matches )
  5. {
  6. if( isset( $matches[2] ) ) {
  7. return '<span style="background-color:#FFFF00;">' . $matches[2] . '</span>';
  8. }
  9.  
  10. return $matches[1];
  11. }
  12.  
  13.  
  14.  
  15. $tekst = 'aaa he sdsd <img src="http://www.wp.pl/i/const/200612/logoWp.gif" height="" /> sdasd he he sdhesd <a href="www.hello.com">he dsad</a> asds &lt;he&gt; he, dw.';
  16.  
  17. $search = 'he';
  18. echo preg_replace_callback( '/(<.*?>)|(' . preg_quote( $search, '/' ) . ')/si', 'highlight', $tekst );
  19.  
  20. ?>
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.