You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除字符串单双引号 解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:30:57