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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top