Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmienna w środek wyrażenia regularnego
Forum PHP.pl > Forum > Przedszkole
latet
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
Radarek
Zapewne chodzi o ta funkcje preg_quote" title="Zobacz w manualu php" target="_manual
latet
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. ?>
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.