2010-06-17 171 views
21

我正在使用wordpress作爲CMS,並試圖允許輸入用戶字段來填充Google Map腳本中的信息窗口。我正在使用它來選擇ID並從自定義字段中提取內容。如何從字符串輸出中刪除回車符?

它工作正常,除非有自定義字段中的任何html中斷腳本。
我看着htmlspcialchar和htmlentities,而不是去掉所有東西,我想讓它逃脫,所以它仍然有效,並且html完好無損。有什麼建議麼?我對PHP很新,並且非常感謝任何指針。

過了一段時間,我仍然無法找到一個很好的解決方案。 TheDeadMedic建議我使用esc_js

但打印所有實際的html代碼而不是渲染它。

非常感謝nickfs,因爲該解決方案稍微好一些,但如果輸出中有回車符,腳本仍然會中斷,這對於CMS來說並不那麼好。

我試過的其他東西是使用修剪功能..這是我現在在哪裏工作,只要輸出中沒有\ r。 $ snip字符串,mapExcerpt字段是來自哪裏的回報:

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

有沒有其他的想法可以解決這個問題?

+0

爲什麼在自定義字段中會有HTML? – Tom 2010-08-25 13:47:00

+0

@Tom控制佈局,鏈接等... – Zac 2010-08-27 03:43:01

+0

爲什麼不設置一個名爲「位置」的自定義字段,他們只能輸入該緯度/長度併爲鏈接,佈局等定義一系列其他自定義字段? – Tom 2010-08-27 06:32:52

回答

85

我不完全理解您的具體問題,但回答你的問題的題目很簡單:

$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 

或者一個都在一個解決方案:

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

你可以還使用正則表達式:

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

您仍然需要使用addslashes()來輸出在Javascript裏面使用$snip

+0

真棒!謝謝。這也是製表符和新行打破它,所以我需要所有這一切。再次感謝:) – Zac 2010-08-31 07:06:31

1

既然你把它放到Javascript中,你需要爲javascript字符串轉義它。 addslashes()應該做的伎倆。

+0

太棒了!感謝那解決了那個問題..只爲了發現一個新的。現在我得到了CMS生成的自動空格和換行符的未終止字符串文字。 – Zac 2010-06-17 06:10:49

+1

檢查我的答案 - 使用WP的PHP函數'esc_js()'而不是'addslashes()'。它將消除報價和換行符。 – TheDeadMedic 2010-06-17 10:15:50

1

嘗試JSON編碼它,我總是這樣做,當我發送數據從PHP到Javascript。它解決了大多數編碼問題,包括換行符。

+0

是的,這就是我的想法,但它並不適用於所有情況。我實際上正面臨着這個確切的問題。我正在使用一個外部XML數據源,我將其導入到MySQL中,並且XML具有保存在數據庫中的「不尋常」的換行符。在客戶端Angular上通過json_encode進行檢索時,由於NL的緣故,會摔倒。到目前爲止,我找不到過濾它們的方法。即使試圖轉換爲ASCII來最小化CTRL字符集 - 沒有任何工作 – 2015-02-06 00:20:04

1

使用WP自己的esc_js(),它將爲JavaScript字符串轉義引號和換行符。

+0

嗯,當我試着這個它吐出實際的HTML代碼,而不是渲染它。也許這是我如何實現它?添加到我原來的帖子我試過這個:var marker = createMarker(point,「<?php echo $ mapTitle; $ mapTitle;?>」,'<?php echo esc_js($ pass_to);?>') – Zac 2010-06-18 05:59:17

+0

What'重做似乎沒問題 - createMarker函數的代碼是什麼? – TheDeadMedic 2010-06-18 11:24:15

+0

函數createMarker(point,name,html)var marker = new GMarker(point,{icon:myIcon}); var linkid =「link」+(gmarkers.length); GEvent.addListener(marker,「click」,function(){ marker.openInfoWindowHtml(html); lastlinkid = linkid; }); return marker; } – Zac 2010-06-21 06:56:06

10

我總是用這個來擺脫討厭的回車的:

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

這是唯一的解決方案,爲我工作:

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

很好的答案!這也是我唯一的工作解決方案,用於將數據導出到CSV文件的php腳本中......謝謝 – LoicTheAztec 2017-02-26 15:34:13

1

,如果你需要刪除的新線符號所有類型(以utf8)

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