web-dev-qa-db-fra.com

Comment supprimer les retours chariot de la sortie de la chaîne?

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?

26
Zac

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.

107
Alix Axel

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
10
Tim

si vous devez supprimer de nouveaux symboles de ligne de tous types (dans utf8)

$dataWithoutCarrierReturn = preg_replace('/\R/', '', $inData);
3
annapp

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.

1
Jan Fabry

Puisque vous mettez cela en Javascript, vous devrez l'échapper pour les chaînes javascript. addslashes() devrait faire l'affaire.

1
nickf

Utilisez la propre esc_js() de WP, qui échappera aux guillemets et aux sauts de ligne pour les chaînes JavaScript.

1
TheDeadMedic

Ce fut la seule chose solution qui a fonctionné pour moi:

$dataWithoutCarrierReturn = preg_replace('/[\x0D]/', '', $inData);
1
Alisso