UTF-8 nelle espressioni regolari di PHP

Ho bisogno di aiuto con espressioni regolari. La mia string contiene caratteri Unicode e il codice sottostante non funziona.

I primi quattro caratteri devono essere numbers, poi virgola e poi qualsiasi carattere alfabetico o spazio bianco … Ho già letto che se aggiungo / tu alla fine dell'espressione regolare ma non ha funzionato per me …

Il mio codice funziona con caratteri non univoci

$post = '9999,škofja loka';; echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+', $post); 

Grazie per le tue risposte!

Risposta aggiornata:
Questo è ora testato e funzionante

 $post = '9999, škofja loka'; echo preg_match('/^\\d{4},[\\s\\p{L}]+$/u', $post); 

\\w non functionrà, perché non contiene tutte le lettere Unicode e contiene anche [0-9_] aggiunta alle lettere.

Importnte è anche il modificatore u per triggersre la modalità Unicode.

Se ci possono essere lettere o spazi vuoti dopo la virgola, allora dovresti metterli nella stessa class di caratteri, nella tua regex ci sono 0 o più spazi bianchi dopo la virgola e poi ci sono solo lettere.

Vedi http://www.regular-expressions.info/php.html per i dettagli sull'espressione php

La \\p{L} (lettera Unicode) è spiegata qui

Importnte è anche l'uso della fine del limite di string $ per garantire che la string completa sia realmente verificata, altrimenti corrisponderà solo al primo spazio bianco e, ad esempio, ignorerà il resto.

[a-zA-Z] corrisponderà solo alle lettere nell'intervallo di az e AZ. Hai lettere non-US-ASCII e quindi la tua regex non corrisponderà, indipendentemente dal modificatore /u . È necessario utilizzare la sequenza di escape caratteri parola ( \w ).

 $post = '9999,škofja loka'; echo preg_match('/^[0-9]{4},[\s]*[\w]+/u', $post); 

Il problema è la tua espressione regolare. Dici esplicitamente che accetti solo abc ... z ABC ... Z š non è nel set az. Ricorda, š è diverso da s come qualsiasi altro personaggio.

Quindi se vuoi davvero solo una sequenza di lettere, devi testare le properties; Unicode. per esempio

 echo preg_match('/^[0-9]{4},[\s]*\p{L}+', $post); 

Questo dovrebbe funzionare perché \p{L} corrisponde a qualsiasi carattere unicode che è considerato una lettera. Non solo dalla A alla Z.

Aggiungi un messaggio e ricorda la barra finale:

 echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+/u', $post); 

Modificato:

 echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);