我需要使用Symfony的link_to()
方法生成一个带有Javascript确认对话框的链接。确认对话框文本从数据库条目中获取其中的一些内容:
<?php echo link_to( "click here", 'category/delete?id='.$id, array( 'confirm' => 'Are you sure you want to delete the category: '.$category->getName().'?' ) ) ?>
但是如果数据库条目中有single quote
,则确认对话框不起作用,因为生成的JS用单引号括起来。因此,如果我有一个名为“John的文章”的类别,生成的JS就像这样开始:
<a onclick="if (confirm('Are you sure you want to delete the category: John's Articles?')) { var f = document.createElement('form'); f.styl.... etc... "
所以,那里的单引号搞砸了确认等等......
无论如何我以为我只会通过$category->getName()
运行addslashes()
但它没有添加任何斜线...我也尝试提前将类别名称保存为单独的变量并添加斜杠那个。但它没有添加任何东西。然后我开始查看Symfony的escaping methods并找到esc_entities()
之类的方法,但结果显示文字看起来像John&#039;s Articles
。
我该怎么办?我想要做的就是在该字符串中的单引号之前添加一个斜杠。我从未尝试str_replace("'","\'",$category->getName())
但是甚至没有做任何事情。我可以在我的模板中创建自己的基本字符串,例如Alex's Test
和addslashes()
就好了。这只是数据库中的这个值,我无法添加任何斜杠。
当我查看数据库中的值时,它看起来就像John's Articles
。没有特殊字符或编码字符。
我在这里缺少什么?
更新
我尝试了以下代码,结果如下:
echo $category->getName()."<br/>";
echo addslashes($category->getName())."<br/>";
$tmp = $category->getName();
echo addslashes($tmp)."<br/>";
$tmp = addslashes($category->getName());
echo $tmp."<br/>";
$tmp = "Testing's the Testing";
echo addslashes($tmp)."<br/>";
$tmp = str_replace("'","\\'",$category->getName());
echo $tmp;
结果:
John's Articles John's Articles John's Articles John's Articles Testing\'s the Testing John's Articles
数据库中的值根本不会添加斜杠...
答案 0 :(得分:0)
好像你只是用
addslashes($category->getName())
但您需要将返回值分配给其他变量,例如
$nameWithSlashes=addslashes($category->getName())
答案 1 :(得分:0)
在插入Javascript时使用json_encode()。它专门用于将任意数据结构转换为语法上有效的Javascript。
<?php echo link_to( ....snip snip... category: '. json_encode($category->getName()) .'?' ) ) ?>
^^^^^^^^^^^^ ^
将处理问题,没有任何“冒险”正则表达式/字符串替换。