php 变量中的引号

Quotes in a php var

我是 php 的新手。我必须在 var 中存储一个 img 标签。我觉得还可以:

$fotoTag1 = "<img src='42.png'
alt='text alt'>";

但如果照片名称或alt?中有单引号,问题就来了。例如,不要

我尝试过的:

$fotoTag1 = "<img src='don't.svg' alt='don't>'";
echo htmlspecialchars ($fotoTag1);
echo addslashes($fotoTag1);

$fotoTag2 = "<img src='don\'t.svg' alt='don\'t'>";
echo $fotoTag2;

(这是一个简化的示例,但是 url 和 alt 来自 sql 数据库,当然,我不能手动更改文本。我需要一个通用的解决方案)

您应该使用 html ascii 代码,因此对于您的示例:

$fotoTag2 = "<img src='don&#39;t.svg' alt='don&#39;t'>";

因为'是单引号的ascii码。

使用 htmlspecialchars() 正确编码您用于构建 HTML 片段的文本片段,而不是您构建的 HTML:

$fotoTag1 = '<img src="'.htmlspecialchars("don't.svg").'" alt="'.htmlspecialchars("don't").'">';

或者,更明确地说:

// Wrapped for clarity
$fotoTag1 = sprintf(
    '<img src="%s" alt="%s">',
    htmlspecialchars("don't.svg"),
    htmlspecialchars("don't")
);

阅读 PHP 中的 sprintf() and the different ways to specify a string

addslashes() 在构建 HTML 内容时没有帮助。作为旁注,它是一个过时的函数,现在没有多少用法。

$fotoTag2 = "<img src=\"don't.svg\" alt=\"don't\">";
echo $fotoTag2;
$fotoTag1 = "<img src='don't.svg' alt='don't>'";

你这里的问题与PHP无关。

您有一个用撇号字符分隔的 HTML 属性值,并且您想在该值中使用撇号。

当您想将 HTML 中具有特殊含义的字符表示为原始字符时,可以使用字符引用。

这可以是命名实体 (&apos;) 或对字符在 unicode 中的位置的数字引用之一 (&#39;);

<img src='don&apos;t.svg' alt='don&#39;t'>

注意:&apos; 添加到 HTML 的时间相对较晚。旧版本IE不支持


或者,您可以更改 HTML,以便使用双引号分隔数据:

<img src="don't.svg" alt="don't">

这会引入一个 PHP 问题,因为您使用它们来分隔字符串文字。

在这种情况下,您需要使用反斜杠字符对 PHP 的数据进行转义。

$fotoTag1 = "<img src=\"don't.svg\" alt=\"don't\">";

或者,您可以使用其他形式的字符串生成,例如 HEREDOC。

$fotoTag1 = <<<END
<img src="don't.svg" alt="don't">
END;

根据经验,最好避免首先将 HTML 存储在变量中。

想输出数据时,切换到输出模式即可:

?>
<img src="don't.svg" alt="don't">
<?php

如果需要变量,您可以随时返回 PHP 模式。

$src = "don't.svg";
$alt = "don't";
?>
<img src="<?php echo htmlspecialchars($src); ?>" alt="<?php echo htmlspecialchars($alt); ?>">
<?php

(请注意,对于所涉及的字符,此示例中不需要 htmlspecialchars,但在处理无法保证是 HTML 的以编程方式获取的数据时,它确实可以保护您安全)。

您使用 htmlspecialchars() 的想法是正确的,这个具体示例的问题是函数不会通过 default 转义 '。您需要添加标志 ENT_QUOTES 以使用 htmlspecialchars().

转义单引号

您还应该将此函数仅应用于您希望转义的字符串,而不是整个 html 行。这可能并且在大多数情况下很可能会导致转义您不想转义的字符的意外副作用。

试试这个,它起作用了:

$fotoTag1 = '<img src="'.htmlspecialchars("don't.svg").'" 
alt="'.htmlspecialchars("don't").'">';
echo $fotoTag1;