【问题标题】:PHP basic concatenation issue?PHP基本连接问题?
【发布时间】:2011-05-16 18:29:46
【问题描述】:
<?php echo ($i % 6 == 5) ? 'style=\"margin-right:0px\"' : ''; ?>

我只是在视口上打印了 style=""。

更新: 当我们在字符串中时,为什么不需要转义双引号? 因为双引号永远不会被视为字符串,如果它们在单引号内?

提前致谢, 内存

【问题讨论】:

  • 我们可以再看一些你的代码吗?反斜杠无关紧要。您应该看到 style=\"margin-right:0px\" 而不是 style="" 即使有斜线。
  • 你是否碰巧有 style=" "
  • 你在哪里看结果?原始输出?浏览器?浏览器的 DOM 检查器?
  • @All - 我看到了很多好的 cmets 和解释。非常感谢大家。 K. 问候。

标签: php quotes double-quotes


【解决方案1】:

为什么当我们在字符串中时不需要转义双引号?因为双引号永远不会被视为字符串,如果它们在单引号内?

manual,关于单引号字符串:

要指定文字单引号,请使用反斜杠 (\) 对其进行转义。要指定文字反斜杠,请将其加倍 (\\)。 所有其他反斜杠实例将被视为文字反斜杠:这意味着您可能习惯使用的其他转义序列,例如 \r 或 \n,将按照指定的字面输出而不是任何特殊含义。

【讨论】:

  • 对,所以输出的是style=\"margin-right:0px\"而不是style="",所以这不是他的问题。
  • @Typeoneerror,是的,这并没有解决他的第一个问题[嗯,实际上没有第一个问题],而只是他在更新时提出的第二个问题。
  • 如果他在浏览器中查看(甚至通过“查看源代码”),我怀疑浏览器的 xml/html 解析器正在过滤并丢弃 style=\"margin-right:0px\" 中的非法属性值,只留下 @ 987654323@.
  • @Lee - 是的,就是这样。
  • 将此标记为对它拥有@lee cmets 事实的答案,从而回答这两个问题。我希望我可以将 3 标记为答案。 :) (stackoverflow 没有从历史中吸取教训,所以它坚持一神论,但没有人解释为什么一神论更好)。那好吧。干杯。 :D
【解决方案2】:

没有必要在单引号内转义双引号。

<?php echo ($i % 6 == 5) ? 'style="margin-right:0px"' : ''; ?>

你只需要在单引号内转义单引号或在双引号内转义双引号。如果您想在单引号字符串中写入单引号,则该单引号将终止该字符串。

$foo = 'a'b';

PHP 将其视为字符串a,后跟一个无意义的b,以及永远不会终止的字符串'; 的开头;这是无效的语法。

$foo = 'a\'b';

这被正确地解析为字符串a'b。你已经转义了这句话通常在这一点上的含义。

使用单引号内的双引号,就不会有这种歧义。单引号字符串中的双引号不会终止字符串,它在那里没有需要转义的特殊含义。如果包含反斜杠,则按字面意思使用反斜杠。

$foo = 'a"b';  // a"b
$foo = 'a\"b'; // a\"b

我想问题在于您如何看待输出。如果输出为style=\"…\",则转义的双引号可能会在您查看输出的环境中导致语法无效。

【讨论】:

  • 也有人对我有点相似的答案投了反对票。不知道为什么。在您编辑之后,我觉得您的回答非常好。 +1,所以至少你现在是。解释会很好。
【解决方案3】:

您对该字符串使用了单引号 ',因此无需在字符串中转义双引号 "。将其替换为'style="margin-right:0px"',它应该可以正常工作。

为了更好地解释 PHP 如何处理字符串和引号,了解'" 之间的区别会很有帮助。用' 封装的字符串总是按原样显示。字符串中的任何内容都不会被解析,包括任何转义字符(例如 \n 用于换行或转义引号,但转义单引号 \' 除外)。相反,封装在" 中的字符串会被解析,因此如果您有任何转义字符,它们将正确显示,如果您在字符串中有任何变量,它们也会被输入。例如,

// Set name variable to my name
$name = "nhinkle";

// Echo hello name with single quotes
echo 'hello {$name}';
// The result will be "hello {$name}"

// Echo hello name with double quotes
echo "hello {$name}";
// The result will be "hello nhinkle"

使用单引号需要更少的处理能力,因为 PHP 不需要扫描字符串来转义任何内容,它只需要找到字符串的结尾。但是,如果您确实需要解析字符串中的内容,请确保使用双引号。

【讨论】:

  • @nhinkie - 非常感谢。这是一个非常清晰的解释,我错过了很长时间。干杯! ;)
猜你喜欢
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2011-04-10
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
相关资源
最近更新 更多