Comment puis-je preg_replace caractère spécial comme "Prêt-à-porter'?
Il y a des tas de Qs à ce sujet sur ce forum et sur le web en général.
Mais je n'ai pas l'obtenir.
Voici mon code:
function updateGuideKeywords($dal)
{
$pattern = "/[^a-zA-Z-êàé]/";
$keywords = preg_replace($pattern, '', $_POST['keywords']);
echo json_encode($keywords);
}
Maintenant, l'entrée est Prêt-à-porter
, et la sortie est "Pr\u00eat-\u00e0-porter"
.
Pourquoi dois-je obtenir le '\u00e' ?
Et comment puis-je modifier mon modèle pour inclure les caractères ê
, à
et é
?
MODIFIER
humm... puisqu'elle ressemble à un unicode /question de caractère, j'opterais pour la solution que j'ai trouvé sur cette page.
Ici, ils suggèrent de faire quelque chose comme ceci:
$chain="prêt-à-porter";
$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");
$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C');
$chain = preg_replace($pattern, $replace, $chain);
EDIT 2
C'est ma solution pour l'instant:
function updateGuideKeywords()
{
//First we replace characters with accents
$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");
$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C'); $shguideID = $_POST['shguideID'];
$keywords = preg_replace($pattern, $replace, $_POST['keywords']);
//Then we remove unwanted characters by only allowing a-z, A-Z, comma, 'minus' and white space
$keywords = preg_replace("/[^a-zA-Z-,\s]/", "", $keywords);
echo json_encode($keywords);
}
- Quel est le résultat de var_dump($_POST['keywords']) ?
- string(2) "55" null
- Pas de "Prêt-à-porter"? Que ce soit, je suis assez sûr que preg_replace() ne modifie pas vos commentaires à tous. Le problème est ailleurs.
Vous devez vous connecter pour publier un commentaire.
"Pr\u00eat-\u00e0-porter"
est un bon JavaScript chaîne représentation littérale dePrêt-à-porter
. Je suppose que vous êtes en train de faire unjson_encode
à un certain point le long de la ligne?Note également que PHP sur les expressions régulières ne sont pas Unicode, donc si vous utilisez UTF-8 (ce qui, en général, vous voulez être), le caractère
ê
n'est pas un seul personnage, mais octet C3 suivie par octet AA. C'est très bien pour de simples littérale des matchs, mais dans des situations comme une classe de personnage vous êtes maintenant l'appariement de deux octets séparément au lieu d'un, les uns après les autres, ce qui peut facilement gâcher votre expression.echo json_encode($keywords);
, alors jealert
le résultat.è
avece
lors de la sauvegarde de base de données?Si vous voulez remplacer les 'é' avec 'e', etc. utilisation iconv() avec la //TRANSLIT modificateur
par exemple,
Un exemple plus complet:
cela peut ne pas être précis à 100%, mais en regardant les regex votre aide je ne pense pas que preg_replace() est la question. Je pense que la raison pour laquelle vous faites '\u00e' est en raison de php est un mauvais support des encodages de caractères.
De ce que je vois de vos sorties, vos personnages ne sont pas supprimés (donc dans votre modèle), de sorte que la seule chose c'est que la sortie est faite en unicode. Essayez de modifier votre document en UTF-8 ou encoder les entités HTML et cela devrait fonctionner, mais méfiez-vous si vous encodez des entités avant de le remplacer, il ne les détecte pas, car ils seront déjà converti.
"Pr\u00eat-\u00e0-porter"
. Donc, je pense que c'est le résultat depreg_replace()
vis " mes personnages (?).Votre code, avec les dernières modifications jusqu'à présent, fonctionne de cette façon:
L'expression
/[^a-zA-Z-êàé]/
signifie "correspondent à rien de ce qui est pas anglais lettre, signe moins, ê, è ou é".preg_replace($pattern, '', 'Prêt-à-porter')
les retours de Prêt-à-porter", car rien ne correspond.json_encode() retourne la représentation JSON de Prêt-à-porter", qui est "r\u00eat-\u00e0-porter'
Il n'est pas clair pour moi ce qui est votre objectif. Si vous souhaitez supprimer tout ce qui n'est pas un signe moins ou à la lettre, vous pouvez essayer ce modèle:
Vous pouvez également utiliser mb_ereg_replace() de travailler avec des caractères multioctets dans votre chaîne.