这可能是我在一个语句中使用单引号和双引号的问题。但我有这段代码:
echo '<form>
<input type="submit" value="$number" onClick="function();">
</form>'
这样做的问题是提交按钮说的是短语$number
而不是该变量的值。
所以我环顾四周,找到了这个解决方案:
echo "<form>
<input type='submit' value='$number' onClick='function();'>
</form>
这会正确输出$number的值,但我习惯于在我的 echo 语句周围使用单引号,并希望保持这种方式。为什么将所有单引号转换为双引号,然后将双引号转换为单引号可以解决问题?是否对第一段代码进行了修改,允许我将单引号保留在回显上,并在属性上保留双引号?
在 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>';
在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.
当您使用单引号时,除了单引号之外,里面的所有内容都是按字面意思理解的。 当使用双引号时,任何以美元符号($)开头的东西都被PHP假定为变量。 使用变量时,我通常喜欢用双引号开始回显。
如果要继续使用单引号,则需要使用追加运算符(句点)。
echo '<form>
<input type="submit" value="' . $number . '" onClick="function();">
</form>';
你可以这样做,避免整个歌舞。我认为它更容易阅读。
<form>
<input type="submit" value="<?php echo $number; ?>" onClick="myFunction()">
</form>
这对我来说输出相同
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";
PHP 将单引号和双引号字符串区分为不同的东西。单引号字符串是文字,您希望它们按原样输出。对于任何PHP变量和适当的替换,都要解释(扫描)双引号字符串。
这只是该语言的一个功能(也是一个有用的功能)。我实际上建议您习惯于在所有语言中对字符串使用双引号。没有一种语言是不可接受的,在静态类型语言(C,C++,Java等)中,单引号表示字符,而双引号表示字符串。也就是说,String foo = 'my string';
在 Java 中会出错,就像在 C 或 C++ 中char * foo = 'my string';
错误一样。但是,char foo = 'a';
是有效的,String foo = "my string";
只有当你需要从PHP获得最后几纳秒的性能时,你才能通过并将双引号字符串转换为单引号字符串。 在其他语言中,这并不重要。Afaik,PHP是唯一使这个字符串特定的双引号与单引号区别的语言。
PHP 对双引号字符串执行所谓的变量插值,这意味着在字符串中搜索它们可能包含的任何变量,这些变量的值在字符串中被替换。如果要保留单引号,则需要将字符串和变量连接在一起,如下所示:
echo '<form>
<input type="submit" value="' . $number . '" onClick="function();">
</form>';
或者,如果要保留双引号,可以转义要打印的双引号:
echo "<form>
<input type='"submit'" value='"$number'" onClick='"function();'">
</form>"