php/html - 三重嵌套引号

php/html - triple nesting quotes

我知道类似的问题在 Stack Overflow 上被问过很多次,但我在 html/php 中遇到了三重嵌套引号的问题。我已经查看了很多问题,但是 none 我找到的解决方案对我有用。这是我正在尝试做的事情(可以在 php 文件中找到):

                    echo"<div id = 'feed-element'>
                    <button class='username-button' type='button'>@".$currentUsername."</button>
                    <button class='hashtag-one-button' type='button'>".$hashtag_one."</button>
                    <button class='hashtag-two-button' type='button'>".$hashtag_two."</button>
                    <button class='play-button' id='play-button".$i."' type='button' onclick='changeImage(this.id,\'".$track_url."\')'></button>
                    <button class='email-button' type='button'>Contact: ".$email."</button>
                </div>";

导致我出现问题的具体行是倒数第三行:

<button class='play-button' id='play-button".$i."' type='button' onclick='changeImage(this.id,\'".$track_url."\')'></button>

无论如何,当我 运行 这段代码时,我得到一个未捕获的语法:无效或意外的令牌错误。我做错了什么?

对于导致错误的代码,您需要转义双引号,而不是单引号:

<button class='play-button' id='play-button".$i."' type='button' onclick='changeImage(this.id,\"".$track_url."\")'></button>

因为你用的是双引号,所以不需要串联。只需插入变量即可!

echo"<div id='feed-element'>
      <button class='username-button' type='button'>@$currentUsername</button>
      <button class='hashtag-one-button' type='button'>$hashtag_one</button>
      <button class='hashtag-two-button' type='button'>$hashtag_two</button>
      <button class='play-button' id='play-button$i' type='button' onclick='changeImage(this.id,\' $track_url\ ')'></button>
      <button class='email-button' type='button'>Contact: $email</button>
  </div>";

要在 PHP/HTML 中的任何级别使用引号,请将第一个级别用作单引号或双引号。之后你有两个选择。 1. 使用双引号 2. 在引号前使用带反斜杠的单引号。例如,echo "This is 'In quotes'";echo "This is \"In quotes\"";

为什么不使用 php heredoc 并跳过转义引号的麻烦?即:

echo <<< EOF
<div id = 'feed-element'>
    <button class='username-button' type='button'>@{$currentUsername}</button>
    <button class='hashtag-one-button' type='button'>{$hashtag_one}</button>
    <button class='hashtag-two-button' type='button'>{$hashtag_two}</button>
    <button class='play-button' id='play-button{$i}' type='button' onclick='changeImage(this.id,{$track_url})'></button>
    <button class='email-button' type='button'>Contact: {$email}</button>
</div>
EOF;

注:
大括号是可选的,但可能有助于提高代码可读性。

为了在一行代码中使用多种类型的引号,请使用 . 示例:

echo 'It\'s me, hey';

你们都疯了。只需结束 php 块并写入任何内容,然后再次启动它。


例子

我想动态创建 3 个不同的 div 元素,每个元素都有两个参数:$ID$TEXT,分别表示 dom 元素 ID 和 innerHTML。

现在让它变得非常复杂,我想将这些元素动态插入到一个 Javascript 函数中,以便在我调用 JS 函数时加载它们。

操作方法如下:您只需结束 PHP 标签,然后输入您想要的内容,就好像 PHP 标签从未存在过一样,它会像在其中指定的那样解析它PHP 无需转义任何东西

<?php

   /* define regular function to generate dynamic element with PHP */
   function create_my_div($ID, $TEXT) {

  /* end the PHP tag and start just regularly entering code 
 ?>

    <div id='<?=$ID;?>'>
      <?php print_r(htmlspecialchars($TEXT)); ?>
    </div>

   <?php
   /* we started up the PHP tag again, followed by a } to end the function
}

?>

现在,只要我们用 PHP 调用 create_my_div("someID", "some text");,它就会创建我们的 DIV 元素。

假设我们想要在服务器端填充 javascript 函数的 DIV 元素并将它们放入 Javascript 函数 create_my_divs()

我们首先需要有一种方法来确保我们的 DIV 元素像其他答案中提到的那样被正确转义,这可以用这个 PHP 代码来完成:

<?php

function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "[=11=]..'\")));
}

?>

最后,我们所要做的就是在我们的网页上:

<script type="text/javascript">

/* target element is where the DIVS will be created in */

function create_my_divs(target_element) {
    target_element.innerHTML += "<?=escapeJavascriptText(create_my_div("DIV1", "THIS IS DIV1"));?>";
    target_element.innerHTML += "<?=escapeJavascriptText(create_my_div("DIV2", "THIS IS DIV2"));?>";
    target_element.innerHTML += "<?=escapeJavascriptText(create_my_div("DIV3", "THIS IS DIV3"));?>";


}
</script>

此方法将允许您包含 javascript 代码或任何内容,而不必担心三重嵌套


这是此方法的另一个用例:

动态添加Javascript代码:

<?php  
function loop_start($varName) {
   ?>  
   for (var i=0; i<<?php print_r($varName);?>.length; i++) {

   <?php
}

?>

现在您的 Javascript 代码可能如下所示:

<script>
  <?php 
     loop_start("myArray");
     ?>
        console.log(myArray[i]);
     }
</script>

这将导致呈现以下内容:

<script>
  for (var i=0; i<myArray.length; i++) {
        console.log(myArray[i]);
     }
</script>

结论

不用担心尝试三重逃脱或双重逃脱,甚至根本逃脱。

使用此答案中概述的技巧,您可以避免一起转义。

(如果你愿意,请避免混淆)