任何人都有这样的想法吗?
我正在努力解决这个问题:
$toReturn .= "
function addProd(pExists)
{
document.getElementById('products').innerHTML = \"<tr><td id='prod_n'><input type='text' size='10' maxlength='10' name='proj_n' id='prod_n' onchange=".chr(92).chr(34)."saveData(setSaveParams('ajaxSaveDataController.php', 'PROD', 'n'), this.value)".chr(92).chr(34)." value='";
$toReturn .="'></td>
<td id='prod_spec'> <textarea cols='60' name='prod_spec' id='prod_spec' rows='20' onchange=".chr(92).chr(34)."saveData(setSaveParams('ajaxSaveDataController.php', 'PROD', 'prod_spec'), this.value)".chr(92).chr(34)." value='";
$toReturn .="'></td></tr>\" + document.getElementById('prodsTab').innerHTML;
if (pExists == 0)
{
document.getElementById('prodsTab').innerHTML = \"<tr><th id='proj_spec_h'>Name</td><th id='proj_spec_h'>Spec</td></tr>\" + document.getElementById('prodsTab').innerHTML;";
我已经转录了所以不要担心过多的关于主题的错误。
这里发生的是我正在使用PHP来编写调用Ajax函数的Javascript,而让我感到震惊的是"
和'
s
所以我用PHP写了一个返回字符串,所以"
然后我想写一些innerHTML,以便我可以放入\"
然后HTML参数可以在'
到目前为止一切都很好。
那么我的onchange调用最终会以onchange="function('a', 'b')"
结束,好吧,"
来自哪里?如果我使用"
那将结束PHP字符串。如果我使用\"
来结束innerHTML字符串。所以我最终得到PHP来解释这个chr(92).chr(34)
所以这非常混乱,它开始伤害我的头脑。
现在它在第二个$toReturn
之后的那个空白行上失败了,为了便于阅读,我想要它。
我必须在风格或某事方面做错事。
如何处理嵌套的"
?
答案 0 :(得分:4)
考虑使用HEREDOC语法。 http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
<?php
$my_string = <<<EOD
<script type="text/javascript">
var x = "this string has a ' known as a single quote!";
</script>
EOD;
?>
这种语法的优点是能够自由编写html或javascript而无需转义引号。
<强>更新强>
以下是关于HEREDOC的更多信息。
首先,与heredoc语法相关的最常见错误是由空格引起的。 HEREDOC语法需要打开和关闭标识符。在上面的示例中,我使用EOD
作为标识符。重要的是,开头标识符后面没有空格,结尾标识符在新行上,前面没有空格,标识符和分号之间没有空格。
您不必使用EOD
作为标识符。您可以使用更具描述性的内容。
我喜欢使用描述代码块的标识符。
<?php
$html = <<<HTML
<html>
<head>
<title>Example html</title>
</head>
<body>
<p class="paragraph">This is my html!</p>
</body>
</html>
HTML;
$javascript = <<<JAVASCRIPT
<script type="text/javascript">
var helloText = "Hello, my name is Jrod";
alert(helloText);
</script>
JAVASCRIPT;
?>
要在heredoc语法中使用变量,您需要在代码中围绕变量使用花括号。
$widget = <<<WIDGET
<p>Good Morning {$name}</p>
WIDGET;
答案 1 :(得分:4)
使用双重转义双引号:
\\\"
通过这种方式打印时,它将成为一个简单的转义双引号(\"
),它不会出现在innerHTML中。
答案 2 :(得分:3)
您是否考虑过引用引号如\\\"
?
一步后,通常会变为\"
,并且在第二步"
之后。
无论如何,从(php)代码生成(html)代码中的(javascript)代码必然会变得混乱。考虑使用模板系统或分离问题。
答案 3 :(得分:1)
另一个技巧是在将它们放入onchange之前在javascript中定义字符串,然后在那里使用单引号
<script type='text/javascript'>
<!--
var a = 'a';
var b = 'b';
-->
</script>
...
<... onchange='function(a, b)'>