移除字符串单双引号 解决PHP/jQuery+谷歌翻译失效问题
解决含引号字符串的jQuery AJAX翻译失效问题
你的问题核心出在两个关键环节:一是HTML inline事件绑定里的字符串引号冲突导致JS语法报错,二是AJAX参数拼接时未正确处理带引号的内容,引发参数传递异常。下面从前端和后端分别给出针对性的解决方案:
一、前端(jQuery/JS)解决方案
1. 修复HTML事件绑定的引号冲突
原来的onchange直接嵌入带引号的模板变量(比如"New "home"..."),会直接破坏JS语法结构(引号提前闭合)。推荐两种修复方式:
方案A:改用jQuery事件委托(更优雅)
把模板变量存在元素的data-*属性里,完全避开inline事件的引号问题:
<select name="langid" id="langid<@=review_id@>" class="guest clearfix" style="width: 150px;height: 29px;" data-review-id="<@=review_id@>" data-review-title="<@=review_title@>" data-your-view="<@=your_view@>" data-neg-review="<@=neg_review@>"> </select>
然后在JS中绑定change事件,同时处理引号并传递参数:
jQuery(document).on('change', '.guest', function() { const $this = jQuery(this); const reviewId = $this.data('review-id'); // 移除字符串中的单双引号,满足你的输出需求 const cleanTitle = $this.data('review-title').replace(/['"]+/g, ''); const cleanPositive = $this.data('your-view').replace(/['"]+/g, ''); const cleanNegative = $this.data('neg-review').replace(/['"]+/g, ''); const targetLang = $this.val() || 'en'; const url = serverurl + 'index.php/feedback'; showLoadingBar(); // 用对象形式传递data,jQuery会自动处理参数编码,彻底避免引号干扰 jQuery.ajax({ type: "POST", url: url, data: { opcode: 'translate_text', positivereview: cleanPositive, negativereview: cleanNegative, title: cleanTitle, lang: targetLang }, success: function(response) { hideLoadingBar(); jQuery('#btnclose'+reviewId).show(); jQuery('#trans_div'+reviewId).show(); const res = jQuery.parseJSON(response); jQuery('#titleid_'+reviewId).text(res.title); jQuery('#positiveid'+reviewId).text(res.positivereview); jQuery('#negativeid'+reviewId).text(res.negativereview); } }); });
方案B:对模板变量做HTML转义(保留inline事件)
如果坚持使用inline事件,需要在PHP模板输出时用htmlspecialchars转义变量的引号,避免破坏JS语法:
<select name="langid" id="langid<?= $review_id ?>" class="guest clearfix" style="width: 150px;height: 29px;" onchange='translate_text("<?= htmlspecialchars($review_id) ?>","<?= htmlspecialchars($review_title) ?>","<?= htmlspecialchars($your_view) ?>","<?= htmlspecialchars($neg_review) ?>");'>
同时修改translate_text函数,处理引号并改用对象传参:
function translate_text(reviewId, reviewTitle, yourView, negReview) { // 移除单双引号 const cleanTitle = reviewTitle.replace(/['"]+/g, ''); const cleanPositive = yourView.replace(/['"]+/g, ''); const cleanNegative = negReview.replace(/['"]+/g, ''); const targetLang = jQuery('#langid'+reviewId).val() || 'en'; const url = serverurl + 'index.php/feedback'; showLoadingBar(); jQuery.ajax({ type: "POST", url: url, data: { opcode: 'translate_text', positivereview: cleanPositive, negativereview: cleanNegative, title: cleanTitle, lang: targetLang }, success: function(response) { hideLoadingBar(); jQuery('#btnclose'+reviewId).show(); jQuery('#trans_div'+reviewId).show(); const res = jQuery.parseJSON(response); jQuery('#titleid_'+reviewId).text(res.title); jQuery('#positiveid'+reviewId).text(res.positivereview); jQuery('#negativeid'+reviewId).text(res.negativereview); } }); }
2. 为什么原来的AJAX拼接字符串会出错?
原来的passDataAsStr手动拼接参数,当参数里有引号时,会直接破坏参数格式(比如positivereview=New "home"会被解析成positivereview=New ,后面的home"变成无效参数)。用jQuery的对象形式传data,它会自动调用encodeURIComponent对每个参数编码,彻底避免这类问题。
二、后端(PHP)解决方案
如果你想在后端统一处理引号(或前后端双重处理更稳妥),可以在接收参数时移除单双引号:
public function translate_text() { try { // 移除参数中的单双引号,同时处理参数不存在的情况 $positive = preg_replace('/[\'"]+/', '', $_POST['positivereview'] ?? ''); $negative = preg_replace('/[\'"]+/', '', $_POST['negativereview'] ?? ''); $title = preg_replace('/[\'"]+/', '', $_POST['title'] ?? ''); $translate_into = $_POST['lang'] ?? 'en'; // 注意:你原代码中$translate_from未定义,需要补充对应的获取逻辑 $var = new translate($translate_from, $translate_into); $ar = array(); if($title) { $ar['title'] = $var->get($title); } if($positive) { $ar['positivereview'] = $var->get($positive); } if($negative) { $ar['negativereview'] = $var->get($negative); } echo json_encode($ar); exit(0); } catch(Exception $e) { $this->log->logIt($this->module."-".""."-".$e); } }
这里改用$_POST代替$_REQUEST,因为AJAX用的是POST方法,更安全精准。
关键总结
- 避开inline事件绑定:用
data-*属性存数据+jQuery事件委托,彻底解决引号冲突。 - AJAX传参用对象形式:不要手动拼接字符串,让jQuery自动处理编码。
- 引号处理:前端或后端单处理即可,前后端都处理能进一步提升容错性。
内容的提问来源于stack exchange,提问作者Paras Prajapati
相关产品推荐
相关产品推荐

