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);