Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Podświetlanie znalezionych fraz w wyniku wyszukiwania, nie uwzględniając wielkości liter w tekście
witosza
post 1.06.2007, 12:47:52
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 sad.gif

Ten post edytował Sabistik 4.06.2007, 09:28:57
Go to the top of the page
+Quote Post
skowron-line
post 1.06.2007, 12:54:56
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


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
witosza
post 1.06.2007, 13:24:36
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 1.06.2007, 13:41:17
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. ?>


--------------------
"There are only 10 types of people in the world: Those who understand binary, and those who don't"
Go to the top of the page
+Quote Post
Sabistik
post 4.06.2007, 09:29:22
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 4.06.2007, 11:40:22
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 4.06.2007, 13:02:03
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.


questionmark.gif ja mam ff i jakos nie mam problemow


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
witosza
post 13.06.2007, 09:25:16
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
questionmark.gif ja mam ff i jakos nie mam problemow
Go to the top of the page
+Quote Post
Kicok
post 13.06.2007, 16:04:53
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


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
witosza
post 14.06.2007, 13:06:03
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 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 14.06.2007, 20:26:10
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>".


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
witosza
post 15.06.2007, 06:35:41
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 15.06.2007, 10:30:09
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 ? 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


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
witosza
post 21.06.2007, 10:19:34
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 ? 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 14.11.2007, 16:59:29
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 15.11.2007, 16:08:55
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. ?>


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 02:24