5

这可能是我在一个语句中使用单引号和双引号时遇到的问题。但我有这段代码:

echo '<form>
      <input type="submit" value="$number" onClick="function();">
      </form>'

这样做的问题是提交按钮说的是短语$number而不是该变量的值。

所以我环顾四周,找到了这个解决方案:

echo "<form>
      <input type='submit' value='$number' onClick='function();'>
      </form>

这会正确输出 $number 的值,但我习惯于在我的 echo 语句周围使用单引号并希望保持这种方式。为什么只是将所有单引号转换为双引号,并将双引号转换为单引号即可解决问题?是否对第一段代码进行了修改,允许我在 echo 上保留单引号,在属性上保留双引号?

4

8 回答 8

13

在 PHP 中,双引号字符串会自动解析其中包含的任何变量,但单引号字符串不会。所以:

$myVar = 21;
echo "myVar: $myVar"

这将输出文本:myVar: 21

然而:

$myVar = 21;
echo 'myVar: $myVar'

这将输出文本:myVar: $myVar

您的代码的一个问题是,在 HTML 中,元素属性的值必须用双引号括起来,而不是单引号。我知道有些浏览器会接受这种形式(甚至根本不接受引号),但这不是正确的方法。

有多种方法可以正确地实现您的愿望。

方法一:转义双引号字符串:

$myVar = 21;
echo "<div id=\"$myVar\"></div>";

虽然这可能是一个相当不雅的解决方案,但它会起作用。

方法二:对单引号(或双引号)字符串使用字符串连接:

$myVar = 21;
echo '<div id="' . $myVar . '"></div>';

这提供了一个更好的 IMO 解决方案,因为如果您愿意,您可以在其中使用函数调用或任何其他 PHP 代码。

警告:

请注意,当您不确定$myVar(即用户输入)的内容时,将其直接放入 HTML 代码是跨站脚本 (XSS) 形式的安全漏洞。想象一下用户输入如下内容:

lol"><script>alert('XSS!');</script></div><div id="lol2

这将导致生成的 HTML 代码包含以下内容:

<div id="lol"><script>alert('XSS!');</script></div><div id="lol2"></div>

这只是一个良性示例,但攻击者可以轻松使用相同的技术窃取用户的 cookie(假装以该用户身份登录)。这里的信息是,当您不能 100% 确定变量的内容时,不要将其直接插入 HTML 代码。相反,调用htmlspecialchars($myVar). 这将转化为以下内容:

$myVar = $_POST['whatever'];
echo '<div id="' . htmlspecialchars($myVar) . '"></div>';
于 2012-06-30T05:00:32.940 回答
2

在 PHP 中,双引号中的变量被处理和评估,而在单引号中,所有内容都被视为字符串的一部分。

这里有一个更好的解释: http ://www.trans4mind.com/personal_development/phpTutorial/quotes.htm

来自上述链接的双引号示例:

$something="Oh something";
echo "My answer is $something.<br>";
//result is: My answer is Oh something

来自上述链接的单引号示例:

echo 'My answer is $something.<br>';
//result is: My answer is $something.
于 2012-06-30T04:53:31.370 回答
1

当你使用单引号时,里面的所有内容都是按字面意思理解的,除了单引号。使用双引号时,任何以美元符号 ($) 开头的内容都被 PHP 假定为变量。使用变量时,我通常喜欢用双引号开始回显。

于 2012-06-30T04:55:35.897 回答
1

如果要继续使用单引号,则需要使用附加运算符(句点)。

echo '<form>
      <input type="submit" value="' . $number . '" onClick="function();">
      </form>';
于 2012-06-30T04:56:27.830 回答
1

你可以这样做,避免整个歌舞。我认为它更容易阅读。

<form>
    <input type="submit" value="<?php echo $number; ?>" onClick="myFunction()">
</form>
于 2014-11-01T04:43:25.543 回答
1

这对我来说输出相同

    echo '<link rel="apple-touch-icon-precomposed" sizes="57x57" href='. ${base_url_favicon} . '/apple-touch-icon-57x57.png />'."\n";
echo "<link rel='apple-touch-icon-precomposed' sizes='57x57' href='${base_url_favicon}/apple-touch-icon-57x57.png' />\n";
于 2018-04-12T19:17:36.667 回答
0

PHP 对双引号字符串执行所谓的变量插值,这意味着搜索字符串以查找它们可能包含的任何变量,其值在字符串中被替换。如果要保留单引号,则需要将字符串和变量连接在一起,如下所示:

echo '<form>
<input type="submit" value="' . $number . '" onClick="function();">
</form>';

或者,如果要保留双引号,可以转义要打印的双引号:

echo "<form>
<input type=\"submit\" value=\"$number\" onClick=\"function();\">
</form>"
于 2012-06-30T04:58:57.597 回答
0

PHP 将单引号和双引号字符串区分为不同的事物。单引号字符串是文字,您希望它们按原样输出。双引号字符串将被解释(扫描)任何 PHP 变量并进行适当的替换。

这只是该语言的一个特性(也是一个有用的特性)。我实际上建议您习惯在所有语言的字符串中使用双引号。没有一种语言是不可接受的,在静态类型语言(C、C++、Java...)中,单引号表示一个字符,而双引号表示一个字符串。也就是说,String foo = 'my string';Java 中的错误与char * foo = 'my string';C 或 C++ 中的错误相同。但是,char foo = 'a';是有效的,原样String foo = "my string";

只有当您需要从 PHP 中获得最后几纳秒的性能时,您才能将双引号字符串转换为单引号字符串。在其他语言中,这无关紧要。Afaik,PHP 是唯一一种使这个字符串特定于双引号和单引号区别的语言。

于 2012-06-30T04:58:19.487 回答