首页 > 解决方案 > 在脚本标签php中转义单引号

问题描述

我有以下内容:

<?php echo '<script type="text/javascript">(function(d) {var url="http://myurl.com"; var iframe = d.createElement("iframe");(iframe.frameElement || iframe).style.cssText = "width: 0; height: 0;border: 0;"; iframe.src = "javascript:false"; d.body.appendChild(iframe);var doc = iframe.contentWindow.document; doc.open().write(\'<body onload="window.location.href=\'+url+\'">\'); doc.close();})(document); </script>'; ?>

它在页面上创建和 iframe,并将 iframe 的 body 标记的 onload 属性设置为url变量的值。

我遇到的问题是,我希望 url 的值用单引号括起来,例如:

<body onload="window.location.href='http://myurl.com'"></body> (**Noticed the single quotes around the url?**)

但相反,我得到了:

<body onload="window.location.href=http://myurl.com"></body> (**without single quotes around the url**)

有人可以帮忙吗?

提前致谢

标签: javascriptphpescapingphp-5.6

解决方案


我个人会使用HEREDOC。它们并不为人所知,但它们是非常强大的弦乐演奏方式

<?php
        echo <<<CODE 
<script type="text/javascript">(function(d) {var url="http://myurl.com"; var iframe = d.createElement("iframe");(iframe.frameElement || iframe).style.cssText = "width: 0; height: 0;border: 0;"; iframe.src = "javascript:false"; d.body.appendChild(iframe);var doc = iframe.contentWindow.document; doc.open().write('<body onload="window.location.href=\''+url+'\'">'); doc.close();})(document); </script>

CODE; //<-- note nothing can come before or after this no spaces or even this comment.

正如我在代码中输入的那样,在结束标识符(在这种情况下)之前/之后没有任何内容,SCRIPT甚至没有一个空格,否则它不会工作。除了;您实际上可以在将其放入数组时将其省略,但这是另一天的故事。

标识符可以是任何东西,但它不应该出现在文本中是一个很好的一般规则。

这里的优点是我们没有使用引号或单引号将其标记为字符串,因此我们可以自由使用两者。除了正常使用之外,没有必要用这个来逃避它们(不需要 PHP 的目的)

就变量插值而言,HEREDOC(上图)的工作方式"(用它们的值替换变量)。

NOWDOC 版本的工作方式与'它不替换变量的情况相同。就是这样完成的

 <?php
 <<<'TAG'
 SOME CONTENT
 TAG;

注意<<<'TAG'代替<<<TAG。与我上面提到的结尾“标签”相同的规则适用。这是非常非常非常重要的,这就是为什么我把它加粗并提到了3次。

更新

正如评论中提到的,如果你想'在 url 周围有额外的东西,你将不得不对它们进行转义,但这是出于 Javascripts 的目的,而不是 PHP。总的来说,它仍然使代码更容易处理。

.write('<body onload="window.location.href=\''+url+'\'">');

因为对于 Javascript 没有办法避免转义,但是您不必担心由于 PHP 的额外转义。我很确定如果没有HEREDOC,您将需要\像这样添加2个额外的东西,这href=\\\''+url+'\\\'很丑陋,或者将您的双引号更改为我真的不喜欢带有单引号的标签( 这'是我的宠儿) <script type='text/javascript' ...对我来说很丑。


推荐阅读