J'utilise wordpress en tant que CMS et j'essaye d'autoriser la saisie de champs utilisateur pour remplir les fenêtres d'informations dans un script Google Map. J'utilise ceci pour sélectionner l'ID et extraire le contenu de un champ personnalisé.
Cela fonctionne bien à moins qu'il n'y ait du HTML dans le champ personnalisé qui casse le script.
J'ai regardé htmlspcialchar et htmlentities mais plutôt que de tout supprimer, j'aimerais qu'il s'échappe pour qu'il fonctionne toujours et que le html soit intact. Aucune suggestion? Je suis assez nouveau pour PHP et j'apprécierais vraiment tous les pointeurs.
Après un certain temps, je ne parviens toujours pas à trouver une excellente solution pour cela. TheDeadMedic a suggéré d'utiliser esc_js
mais cela a imprimé tout le code html réel au lieu de le rendre.
Merci à nickfs car cette solution était légèrement meilleure, mais le script se casse toujours s'il y a des retours chariot dans la sortie, ce qui n'est pas si bien pour un CMS.
Quelque chose d'autre que j'ai essayé était d'utiliser la fonction de découpage .. c'est où je suis maintenant où ça fonctionne tant qu'il n'y a pas de\r dans la sortie. Le champ $ snip string, mapExcerpt est l'endroit d'où proviennent les retours:
<?php $post_id = 207; // Wordpress Post ID
$my_post = get_post($post_id);
$mapTitle = $my_post->post_title;
$mapIMG = get_post_meta($post_id, 'mapImage', true);
$snip = get_post_meta($post_id, 'mapExcerpt', true);
$lat = get_post_meta($post_id, 'lat', true);
$long = get_post_meta($post_id, 'long', true);
$pass_to = '<div class="span-8"><div class="mapTitle">'.$mapTitle.'</div><div class="mapContent">'.$snip.'</div></div>';
$trimmed = trim($pass_to, " \r.");
?>
var point = new GLatLng('<?php echo $lat; $lat; ?>','<?php echo $long; $long; ?>');
var marker = createMarker(point,"<?php echo $mapTitle; $mapTitle; ?>", '<?php echo addslashes($trimmed); ?>');
map.addOverlay(marker);
Y a-t-il d'autres idées sur la façon dont je peux retirer cela?
Je ne comprends pas parfaitement votre problème exact, mais la réponse au titre de votre question est assez simple:
$snip = str_replace('.', '', $snip); // remove dots
$snip = str_replace(' ', '', $snip); // remove spaces
$snip = str_replace("\t", '', $snip); // remove tabs
$snip = str_replace("\n", '', $snip); // remove new lines
$snip = str_replace("\r", '', $snip); // remove carriage returns
Ou une solution tout en un:
$snip = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $snip);
Vous pouvez également utiliser des expressions régulières:
$snip = preg_replace('~[[:cntrl:]]~', '', $snip); // remove all control chars
$snip = preg_replace('~[.[:cntrl:]]~', '', $snip); // above + dots
$snip = preg_replace('~[.[:cntrl:][:space:]]~', '', $snip); // above + spaces
Vous devrez toujours utiliser addslashes()
pour afficher $snip
Dans Javascript.
J'utilise toujours cela pour se débarrasser des retours de transport embêtants:
$string = str_replace("\r\n", "\n", $string); // windows -> unix
$string = str_replace("\r", "\n", $string); // remaining -> unix
si vous devez supprimer de nouveaux symboles de ligne de tous types (dans utf8)
$dataWithoutCarrierReturn = preg_replace('/\R/', '', $inData);
Essayez de l'encoder en JSON, je le fais toujours lorsque j'envoie des données de PHP vers Javascript. Il résout la plupart des problèmes d'encodage, y compris les sauts de ligne.
Puisque vous mettez cela en Javascript, vous devrez l'échapper pour les chaînes javascript. addslashes()
devrait faire l'affaire.
Utilisez la propre esc_js()
de WP, qui échappera aux guillemets et aux sauts de ligne pour les chaînes JavaScript.
Ce fut la seule chose solution qui a fonctionné pour moi:
$dataWithoutCarrierReturn = preg_replace('/[\x0D]/', '', $inData);