如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?

Posted

技术标签:

【中文标题】如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?【英文标题】:How can I pass textarea data via ajax that contains ampersands and/or linebreaks? 【发布时间】:2011-09-07 23:13:29 【问题描述】:

我有一个文本区域,我正在尝试使用 jQuery 通过 ajax 发送。我的问题是当 textarea 包含换行符和 & 符号时。

我用下面的js代码得到textarea的值:

// Find all the fields with class dirty
$('#customer .dirty').each(function() 

    fieldName = $(this).attr('id');
    fieldValue = $(this).val();

    // Create an object of dirty field names and values             
    var fields =  'fieldName' : fieldName, 'value' : fieldValue ; 

    // Add the object of field names and values to the custRecordToUpdate array                 
    custRecordToUpdate.push(fields);  // note: this was initialized before  

);


var arrayToSend = 
    customer : custRecordToUpdate
;

var dataToSend = JSON.stringify(arrayToSend);

与textarea的值如下:

1/8 CLEAR MIRROR  
3/8 CLEAR GLASS

如果我 console.log(dataToSend),我会得到以下信息:

"customer":["fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS"] 

php 脚本上,我 json_decode 发布的数据并且它工作正常。

如果我随后将 textarea 更改为包含 & 符号,如下所示:

1/8 CLEAR MIRROR  
3/8 CLEAR GLASS & GLASS  

json_decode 失败console.log(dataToSend) 显示以下内容:

"customer":["fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"]

json_last_error() 显示语法错误

如果我把上面的js代码改成这样:

fieldValue = encodeURIComponent($(this).val());

然后console.log(dataToSend)显示:

"customer":["fieldName":"cust_note","value":"1%2F8%20CLEAR%20MIRROR%0A3%2F8%20CLEAR%20GLASS"]  

json_decode 失败,两种数据情况均出现 语法错误

那么,如何通过 ajax 将包含换行符和 & 号的 textarea 数据发送到 php 后端,并且 json_decode 不会失败?

解决方案:

基于下面的一些 cmets,我决定更改发送数据的 ajax 代码,这解决了问题,虽然我不知道为什么。

无论如何,这是代码,以防它可以帮助其他人。

var returnedhtml = $.ajax(
   type: "POST",
   url: 'index.php/customer/save_edit_customer',
   //data : "data="+dataToSend, // This is how I was sending it before 
   data :  "data" : dataToSend , // This is the new code that works!
   async: false,
   cache: false
).responseText;

【问题讨论】:

当我在我的 PHP 安装 (5.3.2-1) 上执行 print_r(json_decode($your_bad_sample_here)) 时,我得到了一个预期的对象。我建议在调用 json_decode() 之前立即转储您在 PHP 端收到的字符串。很可能你有一些东西在那里处理数据,比如 magic_quotes 之类的。 @Marc B,这条评论和下面的评论让我思考了我发送数据的方式,而不是关注数据本身。我更改了ajax代码,它突然起作用了。我更新了帖子以反映我所做的更改。所以是的,看起来有些东西正在“处理”数据,但我仍然不确定是什么...... 【参考方案1】:

假设您的文本保存在变量 textareaText 中,请执行此操作

var val = textareaText.replace('&', '__and__');

将此作为 ajax 发送

在服务器端

假设您的 json_decode`d 值保存在名为 $data 的变量中,请执行以下操作:

$val = str_replace( '__and__', '&', $data['value'] );

这样你就可以在不让你的 json_decode 失败的情况下保留与号

你可以用别的东西代替作为占位符

虽然它为什么会中断令人困惑。

【讨论】:

这是一种解决方法,但不能解决根本问题 - javascript 不会将字符串中的 & 视为元字符,因此 json_decode 没有理由失败。其他东西正在修改 OP 的数据。 确切地说,$_GET 或 $_POST 数组发生了变化,或者在用户尝试 json_decode 该值之前数据发生了变化 最好弄清楚是什么/为什么要更改数据,而不是用字符串操作来掩盖它。不能保证它不会将您正在使用的哨兵字符转换成其他东西。 请注意,替换客户端中的 & 符号,然后根据此建议将其切换回服务器端,这对我有类似的问题,我正在创建一个包含来自 tinymce 文本的文本的 javascript 数组领域。该对象与 stringify 打包并通过 ajax 发送到服务器,如果文本包含一个&符号,它会破坏服务器端为空的数组,uriencoding 也没有帮助,按照这里的建议替换&符号解决了问题。【参考方案2】:

我不确定你的对象应该是什么形状,但如果我改变它对我有用:

"customer":["fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"]

"customer":"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS"

即从 json 对象中删除数组语法。

这是我的测试...

    var customer = "customer":"fieldName":"cust_note","value":"1/8 CLEAR MIRROR\n3/8 CLEAR GLASS & GLASS";
    alert(customer.customer.fieldName);
    alert(customer.customer.value);

这表明 & 不是你的问题,但 [] 是。

【讨论】:

以上是关于如何通过包含 & 和/或换行符的 ajax 传递 textarea 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Ajax元素包装?

awk,基于前一行开始范围的换行插入

AJAX:通过ajax获取的编码数据

如何在固定宽度范围内换行或中断长文本/单词?

如何在预填充的文本区域中将 <br /> 转换为换行符

为 jQuery 使用 .text() 方法时如何保持换行符?