Wczytywanie/zmiana polskich znaków w jedną i drugą stronę

0

Witam, potrzebuję do wyszukiwarki funkcję, która będzie wczytywała, czy też zmieniała polskie znaki na zwykłe i na odwrót. Chodzi mi o to, żeby przykładowo po wpisaniu w wyszukiwarkę "ksiazka" znalazło "książka" i jeśli wpiszę normalnie "książka" to żeby też znalazło to samo. Niestety udaje mi się tylko zrobić żeby to działało w jedną stronę, czyli tylko z polskimi znakami lub bez, a nie mam pojęcia jak to zrobić inaczej, dlatego proszę Was o pomoc.

0

poczytaj sobie o str_replace.

1
  • usuwasz polskie znaki
    • z zapytania,
    • z przeszukiwanego tekstu,
  • szukasz.

Alternatywne podejście to użycie do wyszukiwania wyrażeń regularnych i zamiana w zapytaniu wszystkich polskich znaków na zakresy, np:
biała gąska -> bia[lł]a g[aą]ska
Hm... no ale to nie pomoże leniwym uzerom, co będą szukać np: laski panskiej.

0

Wykopałem taką starą funkcję, więc w jedną stronę już masz:

    /**
      * W podanym przez wskaźnik tekście zamienia
      * polskie znaki diakrytyczne na odpowiedniki "bez ogonków",
      * np.: "ć" = "c", "Ą" = "A", "Ź" = "Z", etc.
      * Kodowanie UTF8.
      */
    static function &polishLettersToNormal(&$txt)
    {
        static $pat = array('/\x{104}/msu', '/\x{105}/msu', '/\x{106}/msu', '/\x{107}/msu', '/\x{118}/msu', '/\x{119}/msu',
        '/\x{141}/msu', '/\x{142}/msu', '/\x{143}/msu', '/\x{144}/msu', '/\x{d3}/msu', '/\x{f3}/msu', '/\x{15a}/msu',
        '/\x{15b}/msu', '/\x{179}/msu', '/\x{17A}/msu', '/\x{17B}/msu', '/\x{17C}/msu');
        
        static $rep = array('A', 'a', 'C', 'c', 'E', 'e', 'L', 'l', 'N', 'n',
        'O', 'o', 'S', 's', 'Z', 'z', 'Z', 'z');

        $txt = preg_replace($pat, $rep, $txt);

        return $txt;
    }
0

Tak jak pisałem, umiem zrobić, aby to działało w jedną stronę, czyli żeby w wyszukiwarce wyszukiwało słowa wpisane z polskimi znakami lub bez, ale nie potrafię tego zrobić żeby wyszukiwarka wyszukiwała tak samo słowa z polskimi znakami jak i bez nich, niestety nadal mam z tym problem, a próbowałem już wiele.

0
Martinek1932 napisał(a):

Tak jak pisałem, umiem zrobić, aby to działało w jedną stronę, czyli żeby w wyszukiwarce wyszukiwało słowa wpisane z polskimi znakami lub bez, ale nie potrafię tego zrobić żeby wyszukiwarka wyszukiwała tak samo słowa z polskimi znakami jak i bez nich, niestety nadal mam z tym problem, a próbowałem już wiele.

Takie coś jak OR znasz?

0

Tak, znam, i próbowałem również z OR, ale wtedy w ogóle wyszukiwarka przestaje działać. Niestety, ale jestem w tym zielony i naprawdę próbowałem już wszystkiego, dlatego założyłem temat, bo już nie umiałem sobie z tym poradzić.

0

Nie wiem bo nigdy się nie zastanawiałem nad takim problemem ale aby sprawdzić dane słowo zarówno czy jest z polskimi znakami czy też bez (bądź jest częściowo z jak i bez, przykładowo KSIAŻKA) to najlepsza jest chyba metoda słownikowa. Czyli, usuwamy polskie znaki (ot chociażby w sposób jaki podał @TomRZ) i sprawdzamy:
'ksiazka' => ['książka', 'ksiazka', 'ksiązka', 'ksiażka']

1
leonpro778 napisał(a):Czyli, usuwamy polskie znaki (ot chociażby w sposób jaki podał @TomRZ) i sprawdzamy:

'ksiazka' => ['książka', 'ksiazka', 'ksiązka', 'ksiażka']

Jeśli masz na myśli faktyczną metodę słownikową (czyli mielisz za każdym razem polski słownik) to jest to potężne przeinżynierowanie.

Można by spróbować zrobić to po zakresach, ale wtedy każdy łaciński znak mający zdiakrytyzowany odpowiednik trzeba rozpatrywać jako potencjalną polską literę i się spory bajzel robi, np:

gąska -> gaska -> g[aą][sś]k[aą]
czyli będzie szukać też: gąśką, gaską, gaśka itp.

Sensowniej oddiakrytyzować przeszukiwany tekst i zapytanie.

1

Możesz spróbować użyć tego: https://www.w3resource.com/mysql/string-functions/mysql-sounds_like-function.php. Ale wyniki mogą być dziwne.

Możesz też zmienić kodowanie znaków: https://stackoverflow.com/questions/8647080/accent-insensitive-search-query-in-mysql. Ale też może dziwnie działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1