Discussion:
polskie ctype_alnum(), ctype_alpha()
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
j***@poczta.onet.pl
2015-02-19 19:04:24 UTC
Permalink
<?php
setlocale(LC_ALL, 'pl_PL');
var_dump(ctype_alnum('ó'));
var_dump(ctype_alpha('ó'));

zwraca mi
bool(false) bool(false)
a ja bym chciał
bool(true) bool(true)
Żadnych strposów ani regexpów pisać nie chcę, bo będę przerabiał aplikację na międzynarodową.

Proszę o podpowiedź. Z góry dziękuję.
Borys Pogoreło
2015-02-19 21:59:49 UTC
Permalink
Post by j***@poczta.onet.pl
Żadnych strposów ani regexpów pisać nie chcę, bo będę przerabiał
aplikację na międzynarodową.
Dlaczego ja mam wrażenie, że znów próbujesz zrobić coś, czego nie
powinieneś? Gdzie konkretnie chcesz to sprawdzać?
--
Borys Pogoreło
borys(#)leszno,edu,pl
j***@poczta.onet.pl
2015-02-20 04:34:32 UTC
Permalink
W walidacji server-side:

public function setAnnouncementRules(array $vulgarWords) {
...
array('client_name', 'nazwa / imię i nazwisko', 'trim|validate_name|max_length[60]'),
...
}

public function validate_name($val) {
for ($i = 0, $len = mb_strlen($val); $i < $len; $i++) {
$c = $val[$i];
if (!ctype_alnum($c) && !ctype_space($c) && $c != '-' && $c != '/') {
$this->set_message('validate_name', "Niepoprawny znak '$c' - dozwolone litery, cyfry, odstępy, myślik i ukośnik.");
return FALSE;
}
}
return TRUE;
}
j***@poczta.onet.pl
2015-02-20 09:01:26 UTC
Permalink
Tymczasowo napisałem tak:

define('LETTERS', 'abcdefhjijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZąćęłńóśźżĄĆĘŁŃÓŚŹŻ');

public function validate_name($val) {
for ($i = 0, $len = mb_strlen($val); $i < $len; $i++) {
$c = $val[$i];
if (strpos(LETTERS, $c) === FALSE && !ctype_digit($c) &&
!ctype_space($c) && $c != '-' && $c != '/') {
$this->set_message('validate_name', "Niepoprawny znak '$c' - dozwolone litery, cyfry, odstępy, myślik i ukośnik.");
return FALSE;
}
}
return TRUE;
}

ale nie podoba mi się to rozwiązanie, bo przy modyfikacji aplikacji na międzynarodową (co planuje mój zleceniodawca) będę musiał hardcodować wszystkie alfabety.
Borys Pogoreło
2015-02-20 13:21:22 UTC
Permalink
Post by j***@poczta.onet.pl
ale nie podoba mi się to rozwiązanie, bo przy modyfikacji aplikacji na
międzynarodową (co planuje mój zleceniodawca) będę musiał hardcodować
wszystkie alfabety.
Ciepło, ciepło. A teraz odpowiedz sobie jeszcze na pytanie czemu Hans
Müller mieszkający w Polsce, z polskim obywatelstwem, nie mógłby się
zarejestrować?
--
Borys Pogoreło
borys(#)leszno,edu,pl
j***@poczta.onet.pl
2015-02-20 15:18:30 UTC
Permalink
A da się sprawdzić czy znak $c jest w ogóle literą (tzn. dowolnego alfabetu)? Dlaczego ctype_alpha() zwraca false dla 'ó'?
setlocale(LC_ALL, 'pl', 'pl_PL', 'pl_PL.UTF-8', 'plk', 'polish', 'Polish');
nie pomaga...
j***@poczta.onet.pl
2015-02-20 16:39:31 UTC
Permalink
Chyba oleję problem liter, w końcu klient może chcieć wprowadzić jako swoją nazwę moja_firma.pl - więc '_' i '.' powinienem też akceptować.
Borys Pogoreło
2015-02-20 20:34:38 UTC
Permalink
Post by j***@poczta.onet.pl
A da się sprawdzić czy znak $c jest w ogóle literą (tzn. dowolnego alfabetu)? Dlaczego ctype_alpha() zwraca false dla 'ó'?
setlocale(LC_ALL, 'pl', 'pl_PL', 'pl_PL.UTF-8', 'plk', 'polish', 'Polish');
nie pomaga...
Ale PO CO?

Co drugie Twoje pytanie tutaj to jakiś sztucznie stworzony problem, na
który znajdujesz jeszcze gorsze rozwiązanie. Jeśli tę energię przeznaczysz
na fazę projektową, to wszystkim to wyjdzie na zdrowie.

Co do pytania: bo PHP i funkcje korzystające z locale to jest jakieś
nieporozumienie.
--
Borys Pogoreło
borys(#)leszno,edu,pl
j***@poczta.onet.pl
2015-02-23 08:36:05 UTC
Permalink
Post by Borys Pogoreło
Co drugie Twoje pytanie tutaj to jakiś sztucznie stworzony problem, na
który znajdujesz jeszcze gorsze rozwiązanie. Jeśli tę energię przeznaczysz
na fazę projektową, to wszystkim to wyjdzie na zdrowie.
Przepraszam Cię, masz rację. Ostatnio zrobiłem się niecierpliwy i nerwowy, bo za mało odpoczywam.
Loading...