Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: str_replace, a sposób na ignorowanie wielkości liter
Forum PHP.pl > Forum > PHP
sonicius
Krótko o co mi chodzi:

mam zapytanie z bazy mySql, które wybiera mi rekordy, gdzie w kolumnie opis znajdzie ciąg zadany z formularza np %Szkoła wyższa%

CODE
SELECT opis from jakas_tabela WHERE opis like %string z formularza%


Mysql domyślnie ignoruje wielkości liter (i bardzo dobrze)

Meritum:

Chcę znalezione słowo opisu zaznaczać dodatkowym stylem CSS

Wpadłem na proste rozwiązanie:

CODE
str_replace($string_z_formularza, '<span style="color: red;">'.$string_z_formularza.'</span>', $calosc_opisu_z_bazy)


Jednak ma to jedną wadę szukane wyrażenie musi "trafić" w wielkość liter jakie są w bazie danych:

Czyli - w bazie opis jest np. "test test test test Szkoła Wyższa test test test"

Str_replace oczywiście przyniesie skutek (i doda klase CSS) tylko jeżeli będziemy wyszukiwać ze zgodnością wielkości liter: "Szkoła Wyższa"

Jeżeli wpiszemy "szkoła wyższa" - niestety sad.gif Mysql zwróci wynik, ale str_replace nie wykona swojego zadania.

Prosiłbym o jakiś pomysł jak to najlepiej rozwiązać:

W ostateczności możnaby "podnosić" wielkość znaków całego opisu z bazy jak i wyrażenia z formularza, ale to skutkowałoby "podniesieniem" i wyświetleniem całego opisu w wielkich znakach, a tego chciałbym uniknąć.
krowal
http://snippets.bigtoach.com/snippet/stri_replace/ albo preg_replace()
sonicius
Sprytne rozwiązanie, ale ma jeszcze malutką wade

Co prawda wyszuka dowolnie pasujący wyraz (jeżeli chodzi o wielkość liter), ale jak by jeszcze wykombinować aby nie podmieniało (tych wielkości liter) z zadanych w formularzu.

Bo w formularzu wpiszemy np szKołA WyżSzA i zostanie wyświetlone to jako wynik hmm...
sonicius
Jednak nie działa mi coś to jak należy:

Napisze moje zastosowanie:

CODE
$zm = 'sdsd Test slsldjk';
$szukana = 'test';
$zm2 = $this->ext_str_ireplace($szukana,'<span style="background-color: yellow;">'.$szukana.'</span>',$zm);
echo $zm2;


Wynik to:

sdsd test slsldjk

Zamiast:

sdsd Test slsldjk



Dla uzupełnienia dodam, że wcześniejsza funkcja z przykładu manuala działa poprawnie:

function highlightStr($haystack, $needle, $highlightColorValue)
jmail
no przecież podstawiasz $szukana która jest pisana z małej litery oO

musiałbyś zrobić tak

wyszukać czy taki ciąg istnieje a nastąpnie pobrać go ze stringa i wstawić to co pobrałeś w to miejsce a nie to co wyszukujesz
tiraeth
  1. <?php
  2. function ext_str_ireplace($findme, $replacewith, $subject)
  3. {
  4. // Replaces $findme in $subject with $replacewith
  5. // Ignores the case and do keep the original capitalization by using $1 in $replacewith
  6. // Required: PHP 5
  7.  
  8. $rest = $subject;
  9. $result = '';
  10.  
  11. while (stripos($rest, $findme) !== false) {
  12. $pos = stripos($rest, $findme);
  13.  
  14. // Remove the wanted string from $rest and append it to $result
  15. $result .= substr($rest, 0, $pos);
  16. $rest = substr($rest, $pos, strlen($rest)-$pos);
  17.  
  18. // Remove the wanted string from $rest and place it correctly into $result
  19. $result .= str_replace('$1', substr($rest, 0, strlen($findme)), $replacewith);
  20. $rest = substr($rest, strlen($findme), strlen($rest)-strlen($findme));
  21. }
  22.  
  23. // After the last match, append the rest
  24. $result .= $rest;
  25.  
  26. return $result;
  27. }
  28.  
  29. $tekst = 'Lorem IpSuM dolor ipsum';
  30. echo ext_str_ireplace('ipsum', '<b>$1</b>', $tekst);
  31. ?>


Jak nie działa, jak działa.
kleer94
Rejestrowałem się przedewszystkim, aby odpowiedzieć na to pytanie smile.gif.
Mam nadzieję, że w przyszłoći ktoś na tym skorzysta, bo jest już troche późno na odpowiedź.
Funkcja "str_ireplace" jest analogiczna do funkcji "str_replace", tylko, że ta pierwsza ignoruje wielkość liter.
Pozdrowionka
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.