2010-03-18 7 views
1

J'essaie de nettoyer une chaîne provenant d'un champ de recherche sur un site multilingue.regex pour filtrer tous les caractères sauf ceux inclus dans la liste blanche d'une chaîne multilingue

Normalement, j'utiliser une expression régulière comme:

$allowed = "-+?!,.;:\w\s"; 
$txt_search = preg_replace("/[^" . $allowed . "]?(.*?)[^" . $allowed . "]?/iu", "$1", $_GET['txt_search']); 

et qui fonctionne très bien pour les textes en anglais.

Cependant, maintenant je dois faire la même chose quand les textes saisis peuvent être dans n'importe quelle langue (russe maintenant, chinois dans le futur).

Comment nettoyer la chaîne tout en conservant les "textes normaux" dans la langue d'origine?

Je pensais à passer à une liste noire (bien que je ne préfère pas ...) mais à ce moment l'expression régulière détruit complètement toute l'entrée originale.

Répondre

6

vous pouvez utiliser \ p {LN}[\p{L}\p{N}] au lieu de \ w, voir http://www.php.net/manual/en/regexp.reference.unicode.php

+0

Merci. Je continue d'obtenir * une chaîne UTF-8 non valide à l'offset 5 *. Est-il possible que PCRE n'ait pas été compilé avec des propriétés Unicode et puis-je vérifier cela? Pour l'instant, je ne fais que tester sur un serveur de bureau Ubuntu 9.10. – jeroen

+0

Je ne peux pas le faire fonctionner, mais je pense que je vais l'essayer sur un autre serveur, c'est peut-être un problème local. – jeroen

1

Il est un problème commun, que les lettres russes pas reconnues par \ w modèle, vous pouvez donc utiliser

$ permis = "- +,;:!. \ W \ sа-я";

+0

Will not [а-я] être remplacées par leur nombre de caractères UTF-8, donc [50-60000] (numéros pas précis)? Ce serait lent pour regex, je pense? –

+0

Pouvez-vous utiliser une classe de caractères à l'intérieur d'une classe de caractères? Cela se traduirait par [^ - +?!,.;:: \ W \ s [a-я]] – jeroen

+0

Jeroen, Je peux, mais vous avez raison, il n'y a pas de "sous-classe", donc il ajoute "[" et " ] "symboles. Réponse fixe :) – dchekmarev

Questions connexes