将带有撇号的字符串从PHP传递到JavaScript函数

时间:2012-03-05 02:47:25

标签: php javascript escaping

一个简单的问题,我也找不到'正确'的答案。

我有一个PHP脚本,可以从数据库中读取人名,并将其显示在表中。在每一行中,我将该人的姓名超链接到一个JavaScript函数,该函数显示一个弹出窗口,其中包含该人的姓名作为标题 - PHP代码和生成的html如下:

$name = $results['name'];
echo '<a href="javascript:void(0)" onclick="popup(this, '\' . $name . '\')">' . $name . '</a>';

使用html:

<a href="javascript:void(0)" onclick="popup(this, 'Steve Smith')">Steve Smith</a>

一切正常,除非我点击一个带有连字符的名字,例如“Bryce D'Arnoud”,这会导致撇号打破html。为了解决这个问题,我正在使用PHP addslashes()函数,从而得到以下代码&amp; HTML:

$name = $results['name'];
echo '<a href="javascript:void(0)" onclick="popup(this, '\' . addslashes($name) . '\')">' . $name . '</a>';

使用html:

<a href="javascript:void(0)" onclick="popup(this, 'Bryce D\'Arnoud')">Bryce D'Arnoud</a>

一切运行正常,但由于某种原因,JavaScript不会删除转义字符,而在popup()函数中,如果我提醒名字,我会看到“Bryce D \'Arnoud”

function popup(t, name) {
  alert(name);
}

关于我哪里出错的任何建议?

2 个答案:

答案 0 :(得分:4)

首先,如果你没有在标记中混合使用JavaScript,那么生活将变得容易多了。相反,让PHP形成语义标记,并使用JavaScript访问数据:

$name = $results['name'];
echo '<a href="#" class="popup" data-name="' . $name . '">' . $name . '</a>';

然后访问该值(我使用jQuery进行简洁):

$('.popup').click(function(e) {
    e.preventDefault();

    alert($(this).attr('data-name'));
});

在原生JS中(我认为):

document.getElementsByClassName('popup').onclick = function (e) {
    e = e || window.event;

    e.preventDefault();

    alert(this.getAttribute('data-name'));
};

答案 1 :(得分:3)

不会逃避双引号工作吗? (未经测试)

echo "<a href=\"javascript:void(0)\" onclick=\"popup(this,'$name')\">$name</a>";

编辑:很抱歉错过了这一点。但是,使用preg_replace将单引号替换为HTML实体可能会这样做。

echo '<a href="javascript:void(0)" onclick="popup(this,\'' . preg_replace("/'/",'&#39;',$name) . "')\">$name</a>";

编辑2 事实上,转换$name中的所有内容可能更加清晰:

$name = preg_replace("/'/", '&#39;', $results['name']);
echo "<a href=\"javascript:void(0)\" onclick=\"popup(this,'$name')\">$name</a>";