Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyrażenia regularne, a znaki polskie
Najki
post 26.10.2006, 08:41:17
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


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.

Ten post edytował Najki 25.10.2006, 12:57:36


--------------------
Go to the top of the page
+Quote Post
siemakuba
post 26.10.2006, 08:58:51
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


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.

Ten post edytował siemakuba 26.10.2006, 08:59:01
Go to the top of the page
+Quote Post
Najki
post 26.10.2006, 09:11:04
Post #3





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


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.

Ten post edytował Najki 26.10.2006, 09:12:00


--------------------
Go to the top of the page
+Quote Post
siemakuba
post 26.10.2006, 09:21:05
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


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.

Ten post edytował siemakuba 26.10.2006, 09:23:11
Go to the top of the page
+Quote Post
Najki
post 26.10.2006, 09:35:11
Post #5





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


Przykro mi, ale ciąg "Czarna Owca ąćęłńóśźż" nie przechodzi sad.gif.


--------------------
Go to the top of the page
+Quote Post
siemakuba
post 26.10.2006, 10:11:24
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


:) Masz rację, zapomniało nam się o jeszcze jednym dozwolonym znaku - spacji :)
  1. <?php
  2. preg_match('#^[a-z0-9_-.:!?;ąćęłńóśźżĄĆĘŁŃÓŚŹŻ ]*$#is', $sText);
  3. ?>

pozdr.
Go to the top of the page
+Quote Post
Najki
post 26.10.2006, 10:26:34
Post #7





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


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

Dziękuję Ci bardzo za pomoc smile.gif.


--------------------
Go to the top of the page
+Quote Post
Kamil J.
post 30.10.2006, 20:01:39
Post #8





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


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.

Ten post edytował Kamil J. 30.10.2006, 20:02:20


--------------------
Workspace: Ubuntu 8.04, PDT.
Go to the top of the page
+Quote Post
BlueMan
post 2.03.2010, 11:36:07
Post #9





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 3.06.2003
Skąd: Sosnowiec

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


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.
Go to the top of the page
+Quote Post
kirex
post 7.04.2010, 10:46:12
Post #10





Grupa: Zarejestrowani
Postów: 16
Pomógł: 4
Dołączył: 3.03.2008

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


$wyr = '#[\p{L}0-9.-_]+#u';
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: 25.04.2024 - 06:06