在 echo 语句中混合使用 html 和 php 变量


Mixing html and php variables inside an echo statement

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

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>"