Abbinamento dei caratteri di lettere Unicode in PCRE/PHP
-
13-11-2019 - |
Domanda
Sto cercando di scrivere un validatore ragionevolmente permissivo per i nomi in PHP e il mio primo tentativo consiste nel seguente schema:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
Questo alla fine viene passato a una chiamata a preg_match()
. Per quanto ne so, questo funziona con il tuo alfabeto ASCII vaniglia, ma sembra inciampare su personaggi più intensi come ă o 张.
C'è qualcosa che non va nel modello stesso? Forse mi aspetto \p{L}
fare più lavoro di quanto penso che faccia?
O ha qualcosa a che fare con il modo in cui viene trasmesso l'input? Non sono sicuro che sia pertinente, ma mi sono assicurato di specificare una codifica UTF8 nella pagina del modulo.
Soluzione
Penso che il problema sia molto più semplice di così: hai dimenticato di specificare il u
modificatore. Le proprietà dei caratteri Unicode sono Disponibile solo in modalità UTF-8.
Il tuo regex dovrebbe essere:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
Altri suggerimenti
Se si desidera sostituire Unicode old pattern
insieme a new pattern
Dovresti scrivere:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
Quindi la chiave qui è u
modificatore
Nota : Il tuo server php version
Shoud sia almeno PHP 4.3.5
Come menzionato qui php.net | Modificatori di pattern
U (PCRE_UTF8) Questo modificatore attiva ulteriori funzionalità di PCRE incompatibili con Perl. Le stringhe di pattern sono trattate come UTF-8. Questo modificatore è disponibile da PHP 4.1.0 o superiore su UNIX e da PHP 4.2.3 su Win32. La validità UTF-8 del modello viene verificata dal PHP 4.3.5.
Grazie AgreeOrNot
Chi mi dà quella chiave qui preg_replace corrisponde a tutta la parola in arabo
L'ho provato e ha funzionato in localhost, ma quando lo provo in server remoto non ha funzionato, quindi ho scoperto che php.net inizi l'uso u
Modificatore in PHP 4.3.5. , Aggiorno la versione PHP e funziona
È importante sapere che questo metodo è molto utile per gli utenti arabi (عربي) perché - come credo - Unicode è la migliore codifica per la lingua araba e la sostituzione non funzionerà se non si utilizza il u
Modificatore, vedi l'esempio successivo dovrebbe funzionare con te
$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);
Prima di tutto, la tua vita sarebbe molto più semplice se usassi singoli apostrofi invece di doppie citazioni quando scrivi questi - hai bisogno di solo una retroscena. Secondo, combinando segni \pM
dovrebbe anche essere incluso. Se trovi un personaggio non abbinato, scopri il suo punto di codice Unicode e quindi puoi usare http://www.fileformat.info/info/unicode/ per capire dove si trova. ho trovato http://hsivonen.iki.fi/php-utf8/ Uno strumento inestimabile quando si eseguono il debug con le proprietà UTF-8 (non dimenticare di convertirsi in hex prima di provare a cercare: array_map('dechex', utf8ToUnicode($text))
).
Ad esempio, si rivela essere http://www.fileformat.info/info/unicode/char/0102/index.htm E essere a Lu e quindi dovrebbe abbinarlo e mi corrisponde. L'altro personaggio è http://www.fileformat.info/info/unicode/char/5f20/index.htm ed è anche Isletter e in effetti si abbina per me. Hai compilato le tabelle dei caratteri Unicode?