Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne, a znaki polskie
Forum PHP.pl > Forum > PHP
Najki
Witam.

Próbowałem już różnych sposobów, również zaczerpniętych z manual'a, szukałem na forum i o dziwo nic nie znalazłem takiego, co wreszcie by mi pomogło. Próbowałem m.in.

  1. <?php
  2. preg_match('#^[a-z0-9_-.:;x{b1}x{e6}x{ea}x{b3}x{f1}x{f3}x{b6}x{bc}x{bf}]$#imxDX', $sText);
  3. ?>


  1. <?php
  2. różne kombinacje modyfikatorów: imxDX
  3. ?>


  1. <?php
  2. setlocale (LC_ALL, 'pl_PL');
  3. $bolMatch = preg_match("/^[[:alpha:]]+$/", $strData);
  4. ?>


  1. <?php
  2. preg_match('#^[a-z0-9_-.:;±ćęłńó¶Ľż]$#i');
  3. ?>


Żadne z powyższych rozwi±zań mi nie pomogło i wyrażenie nadal nie przepuszcza polskich liter.

Proszę o pomoc.

Pozdrawiam, Najki.

Czy ten problem jest tak trudny, że nikt nie odpowiada? Może ten problem jest tak banalny, że nikt nie odpowiada? A może ten problem jest niemożliwy i co¶ jest skopane z moim wampserver'em na localhost'cie ?

Powiedzcie cokolwiek co może mi pomóc, mam krótki deadline z projektem.
siemakuba
Rozumiem, że te wyrażenie ma sprawdzać czy podany ciąg zawiera polskie znaki diakrytyczne?

  1. <?php
  2. $str = 'zażółć gęślą jażń';
  3.  
  4. if (preg_match('/[ęóąśłżźćńĘÓĄŚŁŻŹĆŃ]/i', $str))
  5. {  echo 'Tak, są polskie znaki';
  6. }
  7. else
  8. {  echo 'Nie, nie ma polskich znakw';
  9. }
  10. ?>
Wynik u mnie:
Kod
Tak, są polskie znaki
Myślę, że problem może być w różnicy kodowania pliku i danych wejściowych. U mnie kodowanie pliku jest UTF-8 ale dane są wpisany w pliku, więc wszystko się zgadza. Jeżeli dane pobierasz z zewnątrz (DB, GET, POST itd.) proponuję przekonwertować najpierw string do odpowiedniego kodowania, używając np. iconv" title="Zobacz w manualu php" target="_manual

Jeżeli masz natomiast dostęp do biblioteki mbstring" title="Zobacz w manualu php" target="_manual, to jej funkcje powinny pomóc.

pozdr.
Najki
Teraz przepuszcza tekst, jeśli w środku znajdzie jakiś polski znak, bo brakuje ograniczników początku i końca stringa (^ i $). Z tego co dalej badam sprawę od wczoraj, to chyba właśnie te ograniczniki są powodem moich problemów. Dlaczego ? Ostatnia wersja wyrażenia, z jakiej korzystam?

  1. <?php
  2. public static function TestText ($sText)
  3. {
  4. return preg_match('#^a-z0-9_-.:!?;ąćęłńóśźżĄĆĘŁŃÓŚŹŻ$#ismU', $sText);
  5. }
  6. ?>


To jest po prostu filtr sprawdzający poprawność wprowadzonych znaków przez użytkownika. Powinien przepuścić:
  • litery małe i duże
  • cyfry
  • polskie znaki małe i duże
  • myślnik
  • podkreślnik
  • kropkę
  • dwukropek
  • średnik
  • wykrzyknik
  • znak zapytania
Please, help me sad.gif.

A co do kodowania to nie powinno być problemu - są to dane pobierane $_POST'em, ale kodowanie zarówno pliku, jak i strony to ISO-8859-2, więc powinno być OK.
siemakuba
Ano widzisz, wszystko jasne :)
Po pierwsze, to co podajesz w swoim wyrażeniu to zakres znaków jaki ma znaleźć się w badanym stringu, a zakres należy podać w nawiasie kwadratowym. Stąd, pierwsza zmiana:
  1. <?php
  2. preg_match('#^[a-z0-9_-.:!?;ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]$#ismU', $sText);
  3. ?>

Dalej, nie użyłeś żadnego operatora powtórzenia, więc wyrażenie w takiej formie zadziała tylko dla jednego znaku. Stąd zmiana:
  1. <?php
  2. preg_match('#^[a-z0-9_-.:!?;ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*$#ismU', $sText);
  3. ?>

No i raczej nie potrzebujesz wszystkich modyfikatorów, zakładam, że wtsarczy s i i (ewentualnie jeszcze m). Ostateczna wersja:
  1. <?php
  2. preg_match('#^[a-z0-9_-.:!?;ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*$#is', $sText);
  3. ?>


edit: i musisz jeszcze zastąpić znak - na \- -- jest on znakiem specjalnym wewnątrz nawiasów kwadratowych.

pozdr.
Najki
Przykro mi, ale ci±g "Czarna Owca ±ćęłńó¶Ľż" nie przechodzi sad.gif.
siemakuba
:) Masz rację, zapomniało nam się o jeszcze jednym dozwolonym znaku - spacji :)
  1. <?php
  2. preg_match('#^[a-z0-9_-.:!?;±ćęłńó¶ĽżˇĆĘŁŃÓ¦¬Ż ]*$#is', $sText);
  3. ?>

pozdr.
Najki
No faktycznie biggrin.gif. Nareszcie działa smile.gif.

Dziękuję Ci bardzo za pomoc smile.gif.
Kamil J.
Sory, że rozwi±zanego kotleta biorę, ale

  1. <?php
  2. preg_match("/[p{L}]+/", $str);
  3. ?>


Jeżeli robimy stronę w unicode, to \p{L} oznacza wszystkie znaki literowe. I po problemie ;-)

Pozdrawiam, Kamil.
BlueMan
Mogę odgrzebać temat? smile.gif

  1. <?php
  2.  
  3. $wyr = '#(\p{L}0-9.-_)+#u';
  4.  
  5. if ( preg_match($wyr, 'tek') ) echo 'tak1<br />'; else echo 'nie1<br />';
  6. if ( preg_match($wyr, 'tektów±¶żĽć') ) echo 'tak2<br />'; else echo 'nie2<br />';
  7. if ( preg_match($wyr, 'tekasdfa%&!@$%#%&') ) echo 'tak3<br />'; else echo 'nie3<br />';
  8. if ( preg_match($wyr, 'innytekstäßüRépubliqueDěčínFrançaise') ) echo 'tak4<br />'; else echo 'nie4<br />';
  9.  
  10. ?>

Zawsze zwraca mi nie :/

Chcę, aby wyrażenie sprawdzało mi wpisanie liter z dowolnego języka, cyfr oraz znaków .-_
Ci±g znaków będzie o minimalnej długo¶ci 1.
kirex
$wyr = '#[\p{L}0-9.-_]+#u';
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.