Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Podświetlanie znalezionych fraz w wyniku wyszukiwania, nie uwzględniając wielkości liter w tekście
witosza
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


  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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Ten post edytował Sabistik 4.06.2007, 09:28:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


wyszukiwarka

ja zrobilem cos takiego ale to jest w ajaxie jaka bedzie ci pasilo to moge wrzucic skrypt
Go to the top of the page
+Quote Post
witosza
post
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Tibod
post
Post #4





Grupa: Zarejestrowani
Postów: 108
Pomógł: 2
Dołączył: 9.05.2007
Skąd: INTERNET

Ostrzeżenie: (0%)
-----


  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. ?>
Go to the top of the page
+Quote Post
Sabistik
post
Post #5


Administrator wortalu


Grupa: Przyjaciele php.pl
Postów: 960
Pomógł: 39
Dołączył: 21.10.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Tytuł tematu nie zgodny z regulaminem forum. W celu odblokowania topcu proszę wysłać mi go w poprawnej formie. Do tego czasu zamykam.

Otwarte.
Go to the top of the page
+Quote Post
witosza
post
Post #6





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
skowron-line
post
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.


(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ja mam ff i jakos nie mam problemow
Go to the top of the page
+Quote Post
witosza
post
Post #8





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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
(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ja mam ff i jakos nie mam problemow
Go to the top of the page
+Quote Post
Kicok
post
Post #9





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Kicok 13.06.2007, 16:05:42
Go to the top of the page
+Quote Post
witosza
post
Post #10





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


W moim przypadku poszukiwane frazy są w tablicy i tu się sprawa komplikuje (IMG:http://forum.php.pl/style_emoticons/default/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. ?>


Ten post edytował witosza 14.06.2007, 13:09:15
Go to the top of the page
+Quote Post
Kicok
post
Post #11





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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>".
Go to the top of the page
+Quote Post
witosza
post
Post #12





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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>".
Go to the top of the page
+Quote Post
Kicok
post
Post #13





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Widzisz jakiś problem w zamienieniu tablicy elementów na ciąg znaków: emelent1|element2|element3|element4 ? (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował Kicok 15.06.2007, 10:31:06
Go to the top of the page
+Quote Post
witosza
post
Post #14





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 1.06.2007
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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 ? (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
--kuba--
post
Post #15





Goście







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?
Go to the top of the page
+Quote Post
Kicok
post
Post #16





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 14:45