![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 2.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 Ten post edytował latet 31.12.2005, 14:23:43 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 188 Pomógł: 0 Dołączył: 23.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Array ( [0] => Array ( [0] => Przy [1] => Przy [2] => przy [3] => przy ) ) \b lapie granice wyrazow. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 2.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
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:
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:
skoro wyżej jest to:
poza tym świetnie działa to:
Dzięki, latet Ten post edytował latet 31.12.2005, 17:03:40 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 188 Pomógł: 0 Dołączył: 23.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
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
![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 2.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 ![]() 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...=0entry220038 latet Ten post edytował latet 1.01.2006, 17:17:39 |
|
|
![]()
Post
#6
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 2.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 225 Pomógł: 18 Dołączył: 30.06.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 2.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki - już problem rozwiązałem (dość przypadkowo)
![]() Oto rozwiązanie:
co jest nieco dziwne, bo nie działało tak:
Oczywiście nie działa też tak:
Pozdrawiam, latet Ten post edytował latet 1.01.2006, 18:47:32 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 06:07 |