2010-06-17 24 views
21

Estoy usando wordpress como CMS y estoy tratando de permitir que los campos de los usuarios ingresen para llenar las ventanas de información en un script de Google Map. Estoy usando esto para seleccionar la identificación y obtener el contenido de un campo personalizado.¿Cómo eliminar los retornos de carro de la salida de la cadena?

Funciona bien a menos que haya algún html en el campo personalizado que rompa la secuencia de comandos.
Miré htmlspcialchar y htmlentities pero en lugar de quitar todo me gustaría tenerlo escapado para que todavía funcione y el html esté intacto. ¿Alguna sugerencia? Soy bastante nuevo en PHP y realmente apreciaría cualquier apuntador.

Después de un tiempo sigo sin poder encontrar una buena solución para esto. TheDeadMedic sugirió que use esc_js

, pero eso imprimió todo el código html real en lugar de representarlo.

Gracias a los nickfs, ya que esa solución era un poco mejor, pero el script aún se rompe si hay retornos de carro en la salida, lo que hace que esto no sea tan bueno para un CMS.

Otra cosa que intenté fue utilizar la función de recorte ... aquí es donde estoy ahora donde funciona, siempre y cuando no haya salida en la salida. La cadena de recorte $, mapExcerpt campo es donde los rendimientos son procedentes de:

<?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); 

Cualquier otra idea por ahí sobre cómo puedo sacar esto adelante?

+0

¿Por qué habría HTML en el campo personalizado? – Tom

+0

@Tom Para controlar el diseño, los enlaces, etc. – Zac

+0

¿Por qué no simplemente configurar un campo personalizado llamado 'ubicación' donde solo pueden ingresar ese lat/long y definir una serie de otros campos personalizados para enlaces, diseño, etc.? – Tom

Respuesta

85

No entiendo completamente su problema exacto, pero la respuesta al título de su pregunta es muy sencilla:

$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 

o una solución todo en:

$snip = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $snip); 

Puede también utilizar expresiones regulares:

$snip = preg_replace('~[[:cntrl:]]~', '', $snip); // remove all control chars 
$snip = preg_replace('~[.[:cntrl:]]~', '', $snip); // above + dots 
$snip = preg_replace('~[.[:cntrl:][:space:]]~', '', $snip); // above + spaces 

No obstante, deberá utilizar la salida addslashes()$snip dentro de Javascript.

+0

Awesome !! Gracias. También eran pestañas y nuevas líneas que lo rompían, así que necesitaba todo esto. Gracias de nuevo :) – Zac

1

Ya que está poniendo esto en Javascript, tendrá que escapar de las cadenas de JavaScript. addslashes() debería hacer el truco.

+0

¡Genial! Gracias que resolvió ese problema ... solo para descubrir uno nuevo. Ahora obtengo un literal de cadena sin terminación para los espacios automáticos y los saltos de línea que genera el CMS. – Zac

+1

Compruebe mi respuesta: use la función de PHP de WP 'esc_js()' en lugar de 'addslashes()'. Va a desinfectar las citas Y los saltos de línea. – TheDeadMedic

1

Pruebe la codificación JSON, siempre lo hago cuando envío datos de PHP a Javascript. Resuelve la mayoría de los problemas de codificación, incluidas las nuevas líneas.

+0

Sí, eso es lo que pensé, pero no funciona en todos los casos. En realidad estoy enfrentando ese problema exacto. Estoy usando un origen de datos XML externo que importo a MySQL y el XML tiene caracteres de línea nueva "inusuales" que se guardan en el DB. Cuando se recupera mediante json_encode en Angular del lado del cliente, se cae debido a los NL. Hasta el momento no he encontrado medios para filtrarlos. Incluso intenté convertir a ASCII para minimizar el conjunto de caracteres CTRL: nada funcionó –

1

Use el propio esc_js() de WP, que escapará de las cotizaciones y saltos de línea para las cadenas de JavaScript.

+0

Hmmm cuando probé esto escupió el código html real en lugar de renderizarlo. Tal vez es cómo lo implementé? Agregando a mi publicación original Intenté esto: var marker = createMarker (point, "", '') – Zac

+0

What you ' Rehacer parece estar bien, ¿cuál es el código de la función 'createMarker'? – TheDeadMedic

+0

function createMarker (point, name, html) { var marker = new GMarker (point, {icon: myIcon}); var linkid = "enlace" + (gmarkers.length); GEvent.addListener (marcador, "clic", función() { marcador.openInfoWindowHtml (html); lastlinkid = linkid; }); marcador de retorno; } – Zac

10

Siempre lo uso para deshacerse de los retornos de carro molestos:

$string = str_replace("\r\n", "\n", $string); // windows -> unix 
$string = str_replace("\r", "\n", $string); // remaining -> unix 
1

Esta fue la única solución cosa que funcionó para mí:

$dataWithoutCarrierReturn = preg_replace('/[\x0D]/', '', $inData); 
+0

¡Buena respuesta! Esa fue la única solución de trabajo para mí también, utilizada en un script php hecho para exportar datos a un archivo CSV ... Gracias – LoicTheAztec

1

si es necesario para eliminar los nuevos símbolos de línea de todos los tipos (en utf8)

$dataWithoutCarrierReturn = preg_replace('/\R/', '', $inData); 
Cuestiones relacionadas