Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmienna w środek wyrażenia regularnego, (na dodatek UTF-8)
latet
post 31.12.2005, 20:16:55
Post #1





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 2.10.2005

Ostrzeżenie: (0%)
-----


Witam,

W jaki sposób można wstawić zmienną w sam środek wyrażenia regularnego?
Bo ponoć tak, zwyczajnie:
  1. <?php
  2. preg_match('/b' . $slowo . 'b/u', $tekst))
  3. ?>

to nie wolno (i faktycznie, nie działa to u mnie prawidłowo).

Dodam też, że $slowo oraz $tekst to ciągi tekstowe UTF-8, zawierające litery "egzotycznych" języków.

Ponoć "escape meta chars", cokolwiek to jest, może tu pomóc.

Dzięki,

latet

Ten post edytował latet 31.12.2005, 20:35:04
Go to the top of the page
+Quote Post
Radarek
post 1.01.2006, 14:01:51
Post #2





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


Zapewne chodzi o ta funkcje preg_quote" title="Zobacz w manualu php" target="_manual
Go to the top of the page
+Quote Post
latet
post 1.01.2006, 17:15:38
Post #3





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 2.10.2005

Ostrzeżenie: (0%)
-----


Cytat(Radarek @ 2006-01-01 13:01:51)

Hej,

Narobiłes mi na chwilę nadziei, ale niestety sad.gif

Użycie funkcji preg_quote() absolutnie niczego nie zmieniło, zresztą - chyba nie mogło, bo ona modyfikuje tylko pewne znaki, których wcale nie ma w słowach, które testowałem.

(Aha - przypomnę, że cały czas chodzi mi wyłącznie o szukanie słów w ciagach UTF-8!)

Reasumując:

Tylko te trzy poniższe działają dobrze (w sensie znajdują ciagi w dowolnym języku), ale przecież nie o to mi chodzi, bo ja muszę wyszukać tylko pełne słowa, a nie ciąg liter występujący w dowolnym sąsiedztwie.
  1. <?php
  2.  
  3. if (preg_match('/' . $slowo . '/', $linia_slownikowa)) 
  4. if (preg_match('/' . preg_quote($slowo) . '/', preg_quote($linia_slownikowa)))
  5.  
  6. ?>


Problemy zaczynają się, gdy wprowadzam parametr \b (lub \\b) a przecież taki mam cel - znaleźć pełne słowa.

Wszystkie poniższe działają źle i wszystkie w taki sam sposób źle:
  1. <?php
  2.  
  3. if (preg_match('/b' . $slowo . 'b/', $linia_slownikowa)) 
  4. if (preg_match('/b' . $slowo . 'b/', $linia_slownikowa))
  5. if (preg_match('/b' . preg_quote($slowo) . 'b/', preg_quote($linia_slownikowa)))
  6. if (preg_match('/b' . preg_quote($slowo) . 'b/', $linia_slownikowa)) 
  7.  
  8. ?>


Złe działanie polega tu na 2 rzeczach:

1) w ogóle nie są znajdywane ciagi zawierające litery hebrajskie (choć przecież jest to taki sam UTF-8 jak i litery polskie, a polskie znajduje),

2) parametr \b nie działa prawidłowo - np. jeśli szukam tylko "w", to znajduje wyraz "żółw"! Nie znajduje natomiast wyrazów zaczynających się na "w". Dziwne.

Testowalem też dodanie parametru u, ale to tylko pogarsza sprawę:
  1. <?php
  2.  
  3. if (preg_match('/b' . $slowo . 'b/u', $linia_slownikowa)) 
  4.  
  5. ?>

Wtedy ciągi zawierające choćby jedną polską literę nie są znajdowane.

Przypomnę - preg_quote() niczego nie zmieniło.

Wygląda chyba na to, że wyrażenie reg. z parametrem \b głupieje szukając w UTF-8.

Próbowałem użyć funkcji niby stworzonych do UTF-8, ale... dla odmiany... żadne z poniższych nie działa wcale, tzn. w ogóle nic nie znajdzie, w żadnym przypadku, nawet gdy zapodam do odszukania ciąg zawierajacy wyłącznie litery łacińskie:
  1. <?php
  2.  
  3. if (mb_eregi('/b' . preg_quote($slowo) . 'b/', $linia_slownikowa)) 
  4. if (mb_eregi('/b' . preg_quote($slowo) . 'b/', $linia_slownikowa)) 
  5. if (mb_eregi('/b' . preg_quote($slowo) . 'b/', preg_quote($linia_slownikowa))) 
  6. if (mb_eregi('/b' . preg_quote($slowo) . 'b/', preg_quote($linia_slownikowa))) 
  7. if (mb_eregi('/b' . $slowo . 'b/', $linia_slownikowa)) 
  8. if (mb_eregi('/b' . $slowo . 'b/', $linia_slownikowa)) 
  9.  
  10. ?>
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: 8.07.2025 - 10:17