Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak sprawdzić czy ciąg występuje jako całe słowo?
Forum PHP.pl > Forum > PHP
latet
Witam,

Muszę napisać wyrażenia regularne (lub funkcję), które sprawdzi czy dany ciąg znaków występuje w przeszukiwanym dużym tekście jako pełny wyraz.

Czyli jeśli szukamy ciagu "przy" to interesuje nas słowo "przy", a nie słowo "przypadek".

Myślę, że najprościej będzie zdefiniować z czym może sąsiadować taki ciąg, aby był uznany za pełny wyraz.

Do głowy mi przychodzi, że sąsiadować może z:
- początkiem stringu
- końcem stringu
- spacjami oczywiście, w tym innymi znakami tego rodzaju, np. \t, \n, twarda spacja itp
- przecinkiem
- kropką
- średnikiem
- dwukorpkiem
- apostrofami, cudzysłowiami
- nawiasami wszelkiego typu
- wszelkimi znaczakmi, kóre na klawiaturze wpisuje się przez SHITF-cyfra
- pozostałymi znaczkami typu + - = \ / ? ~
- cyframi (opcjonalnie)

Ta lista jest oczywiście umowna i do ustalenia, probelm mam z tym jak to w ogóle napisać? Pewnie funkcja mb_eregi() będzie tu sendem sprawy.

Trudności mam dwie:
1) nie "czuję" wyrażeń regularnych kompletnie sadsmiley02.gif
2) teksty, które mam obsłużyć są w UTF-8, i są w nich egzotyczne języki, tak więc odpada zdefiniowanie z czym szukany ciąg nie może sąsiadować. Trzeba określić z czym może - i to określić to w UTF-8.

Plik .php jest jako taki także kodowany w UFT-8.

Wielkie dzięki!

latet
Radarek
  1. <?php
  2.  
  3. $tekst = "Przy okazji wspomne ze (...). Przyszedl i... dalej nie pamietam :-). Przy. przyprzy. Hm przy? Naprzykszyl mi sie. przy";
  4.  
  5. preg_match_all('/bprzyb/i', $tekst, $arr);
  6.  
  7. echo "<pre>";
  8. print_r($arr);
  9. echo "</pre>";
  10.  
  11. ?>


Cytat
Array
(
    [0] => Array
        (
            [0] => Przy
            [1] => Przy
            [2] => przy
            [3] => przy
        )

)


\b lapie granice wyrazow.
latet
Dzięki Radarek, ale to nie działa dobrze (być może z powodu UTF-8 lub wstawiania zmiennej w środek wyrażenia reg.).

Konkretnie, zrobiłem to tak:

  1. <?php
  2.  
  3. if (preg_match('/b' . $slowo . 'b/u', $tekst))
  4.  
  5. ?>


Działa... ale nie do końca. Np. w ogóle nie znajduje nic jeśli poda się słowo zawierających polskie litery (lub inne narodowe spoza ASCII). Z kolei gdy zapodam tylko 1 literę, np. "w" to znajduje wszystkie słowa zakończone na "w". Coś tu więc nie gra.
Dla słów bez znaków narodowych działa w miarę OK. Próbowałem bez parametru "u" i to niczego (!) nie zmienia.

Na grupie o php Mr. PorneL napisał mi, że nie wolno tak po prostu wstawiać zmiennej do wnętrza wyrażenia regularnego. A ja właśnie muszę szukać słowa podanego przez użytkownika, więc muszę jakoś tam wstawić zmienną. Tylko jak?

Nie wiem też kompletnie dlaczego w ogóle nie działa mi to:

  1. <?php
  2.  
  3. if (mb_eregi('/b' . $slowo . 'b/', $tekst))
  4.  
  5. ?>


skoro wyżej jest to:

  1. <?php
  2.  
  3. mb_internal_encoding("UTF-8");
  4. mb_regex_encoding("UTF-8");
  5.  
  6. ?>


poza tym świetnie działa to:

  1. <?php
  2.  
  3. mb_strtolower($slowo, "UTF-8"));
  4. mb_ereg_replace('"', '', $slowo);
  5.  
  6. ?>


Dzięki,

latet
Radarek
Hm, nie analizowalem calego twojego posta, ale problem moze wynikac z tego ze napisales '\\b' zamiast '\b'. Sprobuj z 1 backslashem, jak nie bedzie dzialac to bedziemy sie zastanawiac smile.gif.
latet
Cytat(Radarek @ 2006-01-01 12:57:20)
Hm, nie analizowalem calego twojego posta, ale problem moze wynikac z tego ze napisales '\\b' zamiast '\b'. Sprobuj z 1 backslashem, jak nie bedzie dzialac to bedziemy sie zastanawiac smile.gif.

Zmiana \\ na \ nic nie zmieniła. W oby przypadkach działa tak samo - tzn. nie ma błędów, ale nie wyszukuje prawidłowo podciągów sadsmiley02.gif

Trochę jestem podłamany, bo problem niby mały, a od 3 dni nie umiem go rozwiązać, nawet przy pomocy grupy i forum...

Więcej napisałem tu:
http://forum.php.pl/index.php?showtopic=39...=0&#entry220038

latet
mike
Połączenie funkcji str_word_count() i array_search() da Ci rozwiązanie.

Nie jest to może najlepszu sposób, bo najlepiej użyć wrażeń regularnych, ale ich nie znam smile.gif
latet
Cytat(mike_mech @ 2006-01-01 15:45:33)
Połączenie funkcji str_word_count() i array_search() da Ci rozwiązanie.

Nie jest to może najlepszu sposób, bo najlepiej użyć wrażeń regularnych, ale ich nie znam smile.gif

Przetestuję (z rozpaczy), ale jest mały kruczek w fukcji str_word_count():
Cytat
For the purpose of this function, 'word' is defined as a locale dependent string containing alphabetic characters, which also may contain, but not start with "'" and "-" characters.


A z próbami ustawiania setlocale() mam doświadczenia małe i bardzo złe...

Jak to ustawić w tym przypadku, skoro teksty w ktorych szukam są wielojęzyczne (aczkolwiek wszystko jest w UTF-8)?

Pozdrawiam,

latet
zulus
  1. <?php
  2. $text = " Jakiś o jakiś ycmś jakiśiowie jakiś ";
  3. $search = "jakiś";
  4. $query = "/W+(" . $search . ")W+/i";
  5. $array = array();
  6. preg_match_all($query, $text, $array);
  7. //eregi($query, $text, $array);
  8. print_r($array);
  9. ?>

to rozwiązanie ma jedną wadę, na początku i na kńcu tekstu musi być coś nie będące słówem np spacja.
latet
Dzięki - już problem rozwiązałem (dość przypadkowo) guitar.gif

Oto rozwiązanie:
  1. <?php
  2. if (mb_ereg('b' . $slowo . 'b', $tekst))
  3. ?>


co jest nieco dziwne, bo nie działało tak:
  1. <?php
  2. if (mb_ereg('/b' . $slowo . 'b/', $tekst))
  3. ?>


Oczywiście nie działa też tak:
  1. <?php
  2. if (preg_match('b' . $slowo . 'b', $linia_slownikowa))
  3. (Warning: Delimiter must not be alphanumeric or backslash!)
  4.  
  5. ?>


Pozdrawiam,

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