我有一个需要打印一些文本的php / javascript脚本。不幸的是,如果字符串具有特殊字符,则js会出现故障
'
以下是该脚本的摘录。 $ messageContent和$ subject是带有html标签的字符串。 (实际上是“'”字符)。
echo '
<script language="javascript">
function SelectRedirect(){
switch(document.getElementById(\'s1\').value)
{
';
echo '
case "?vrj_name='.$vrj_name.'":
window.location="?vrj_name='.$vrj_name.'&messageContent='.$messageContent_vrj.'&from_email='.$from_email.'&email='.$email.'&subject='.$subject.'";
break;
';
}
我在php中添加了一个函数,将“'”替换为“\”,它可以正常工作(js成功执行)但是当我在网页上显示它们时,我无法获取它们。
答案 0 :(得分:3)
执行此操作的最佳方法是使用json_encode
对值进行编码。这是一个简单的例子:
<?php
$name = "Jason's Bakery";
?>
<script>
var name = <?php echo json_encode($name); ?>;
DoSomethingWithName(name);
</script>
这可以用于整数,字符串和其他值。请记住,它会根据需要添加引号,因此您需要组合并编码“整个值”。在使用URL的示例中,您需要使用PHP urlencode()
函数对它们进行FIRST编码,然后将其传递给json_encode
以转换为javascript值。如果您将其放在HTML属性中,例如onclick
,则需要进一步传递htmlspecialchars(..., ENT_QUOTES)
,然后将其放在双引号中。
http://php.net/manual/en/function.json-encode.php
例如,您需要在PHP中构建一个URL,然后在javascript中使用它...
<?php
$name = "Jason's \"Awesome\" Bakery";
$url = "http://site.com/page.php?name=" . urlencode($name);
?>
<script>
var name = <?php echo json_encode($name); ?>;
DoSomethingWithName(name);
</script>
<input type="button" onclick="<?php echo htmlspecialchars('window.location = ' . json_encode($url) . ';', ENT_QUOTES); ?>" value="Click Me" />
结果是这样的:
<script>
var name = "Jason's \"Awesome\" Bakery";
DoSomethingWithName(name);
</script>
<input type="button" onclick="window.location = "http:\/\/site.com\/page.php?name=Jason%27s+%22Awesome%22+Bakery";" value="Click Me" />
毋庸置疑,你不想没有这些:
http://php.net/manual/en/function.json-encode.php
http://www.php.net/manual/en/function.urlencode.php
http://www.php.net/manual/en/function.htmlspecialchars.php
答案 1 :(得分:1)
由于可读性和未来可维护性的考虑,我想指出一些可能对您有帮助的事情。
首先,我看到你在PHP字符串中生成HTML元素。这本身并不坏,但是当你的字符串包含2行或更多行时,管理变得越来越困难。相反,您可能想要考虑转义PHP以输出HTML部分,并重新输入PHP以用于逻辑部分。你可以逃避PHP并在if语句,函数声明等中输入HTML,所以没有充分的理由不这样做。请看下面的示例(此解决方案还以适当的方式转义字符串,其值可以包含单引号,双引号或换行符):
<?php
function urlFriendly($input) {
return urlencode($input);
}
function jsFriendly($input, $urlFriendly = True) {
$output = htmlentities($input, ENT_QUOTES);
// Double quotes in PHP translate "\n" to a newline.
// Single quotes in PHP keep the literal value.
$output = str_replace("\r\n", '\n', $output); // Windows support
$output = str_replace("\n", '\n', $output); // Linux support
if($urlFriendly) { // Encode for use in URLs
$output = urlFriendly($output);
}
return $output;
}
$vrj_name = 'vrj';
$messageContent_vrj = 'message content';
$from_email = 'from email';
$email = 'email';
$subject = 'subject line';
?>
<script type="text/javascript">
function SelectRedirect() {
switch(document.getElementById('s1').value) {
case '?vrj_name=<?php print jsFriendly($vrj_name);?>':
var toloc = '?vrj_name=<?php print jsFriendly($vrj_name);?>';
toloc += '&messageContent=<?php print jsFriendly($messageContent_vrj);?>'';
toloc += '&from_email=<?php print jsFriendly($from_email);?>';
toloc += '&email=<?php print jsFriendly($email);?>';
toloc += '&subject=<?php print jsFriendly($subject);?>';
window.location = toloc;
break;
}
</script>
答案 2 :(得分:0)
就像那样
$escaped_string = addslashes($unescaped_string);
之前
$messageContent = addslashes($messageContent);
$subject = addslashes($subject);
甚至内联
echo '
case "?vrj_name='.$vrj_name.'":
window.location="?vrj_name='.$vrj_name.'&messageContent='.addslashes($messageContent).'&from_email='.$from_email.'&email='.$email.'&subject='.addslashes($subject).'";
break;
';