9
votes

Regex avec la langue russe

Je ne peux pas résoudre mon problème avec REGEXP.

OK, lorsque je tape: p>

$string = preg_replace("#\[name=([a-zA-Z0-9йцукенгшщзхъфывапролджэячсмитьбю .-]+)*]#","$name_start $1 $name_end",$string);


1 commentaires

Veuillez partager plus de détails, tels que les chaînes d'entrée des échantillons et la sortie attendue correspondant à ces chaînes


4 Réponses :


18
votes

Essayez une plage unicode:

"#\[name=([a-zA-Z0-9\x{0430}-\x{044F}\x{0410}-\x{042F} .-]+)]#u"


4 commentaires

C'est mauvais, car c'est illisible! Le code doit être simple et lisible :)


Je pense que vous voulez dire \ x {0401} - \ x {042f} pour les mots russes. A est en effet le premier caractère de l'alphabet russe, mais pas dans la plage Unicode. Vérifiez la table unicode ici


@Iulian Onofrei, ouais, je vois en effet \ x {0401} là, mais ne vois pas la plage \ x {0402} - \ x {0409} . Devrait-il alors être [\ x {0401} \ x {0410} - \ x {042f}] ou vraiment [\ x {0401} - \ x {042f}] ? N'hésitez pas à éditer, bien sûr!


@Bartkiers, oui, tu es Wright. J'ai manqué ça. Je pense que la solution correcte est la suivante: [\ x {0430} - \ x {044f} \ x {0451}] pour les lettres minuscules et [\ x {0401} \ x {0410} - \ x {042f}] pour les lettres majuscules.



6
votes

Le script Unicode commun (pris en charge depuis PCRE 3.3) fournit un test de la propriété Cyrillic .

E.g. Remplacez tous les caractères qui ne sont ni cyrilliques ni chiffres (latin): xxx

Vous pouvez trouver la documentation de cette fonctionnalité sous http://www.pcre.org/pcre.txt " Propriétés de caractère Unicode ".
Et vous devez spécifier le drapeau PCRE8 (U) comme décrit à http: //docs.php .net / référence.pcre.pattern.modificateurs


1 commentaires

AFAIK Il n'y a pas de différences (techniques) entre les scripts "communs" et spécifiant les gammes "manuellement". Donc, ce n'est qu'une question de choix. Sauf peut-être que les noms de propriété sont un peu plus auto-documentant.



0
votes

Celui-ci a fonctionné pour moi: xxx

J'ai testé dans tous les navigateurs, y compris Safari


0 commentaires

-1
votes

Parmi les alphabets les plus utilisés sur Internet.

Cela fonctionne depuis un bon moment, je crois depuis PHP 5.6. P>

// Filter Chinese and Japanese HAN
if (preg_match("/\p{Han}+/u", " 余TEST杭丽人广播", $match)){echo "CHINESE, JAPANESE ";}
// Filter Cyrilic
if (preg_match("/\p{Cyrillic}/u", "Күңел радиосы ", $match)){echo "RUSSIAN ";}
// Filter Greek
if (preg_match("/\p{Greek}/u", "Πρακτορείο ", $match)){echo "GREEK ";}
// Filter Arabic
if (preg_match("/\p{Arabic}/u", "مشال راډیو", $match)){echo "ARABIC ";}
// Filter Armenian
if (preg_match("/\p{Armenian}/u", "Ô±Õ¦Õ¡Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ ", $match)){echo "ARMENIAN ";}
// Filter Thai
if (preg_match("/\p{Thai}/u", "สวท.พะเยา", $match)){echo "THAI ";}
// Filter Georgian
if (preg_match("/\p{Georgian}/u", "რადიო თავისუფალი", $match)){echo "GEORGIAN";}

/* Output: */
/* CHINESE, JAPANESE RUSSIAN GREEK ARABIC ARMENIAN THAI GEORGIAN */


2 commentaires

Veuillez ajouter quelques explications à votre réponse, de sorte que d'autres puissent en apprendre. Autant que je sache, l'OP n'a pas demandé une expression régulière de détecter une langue


C'est le point: aucune explication nécessaire.