我是php的新手。我必须在var中存储img标记。我认为这没关系:
$fotoTag1 = "<img src='42.png'
alt='text alt'>";
但问题是,如果照片名称或alt中有单引号?对于intance,不要
我尝试过:
$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数据库,当然,我无法手动更改文本。我需要一般解决方案)
答案 0 :(得分:2)
使用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")
);
了解sprintf()
以及在PHP中指定string的不同方法。
addslashes()
无效。作为旁注,它是一个过时的功能,现在没有很多用法。
答案 1 :(得分:2)
$fotoTag2 = "<img src=\"don't.svg\" alt=\"don't\">";
echo $fotoTag2;
答案 2 :(得分:1)
$fotoTag1 = "<img src='don't.svg' alt='don't>'";
这里的问题与PHP无关。
您有一个以撇号字符分隔的HTML属性值,并且您希望在该值中使用撇号。
如果要在HTML中将具有特殊含义的字符表示为原始字符,可以使用字符引用。
这可以是命名实体('
),也可以是unicode('
)中字符位置的数字引用之一;
<img src='don't.svg' alt='don't'>
注意:'
相对较晚地添加到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安全
答案 3 :(得分:0)
您使用htmlspecialchars()
时有正确的想法,此具体示例的问题在于default函数无法转义'
。您需要添加标记ENT_QUOTES
以使用htmlspecialchars()
转义单引号。
您还应该将此函数仅应用于您想要转义的字符串,而不是整个html行。在大多数情况下,这可能会导致逃避你不想逃脱的角色的意外副作用。
答案 4 :(得分:0)
试试这个,它正在运作:
$fotoTag1 = '<img src="'.htmlspecialchars("don't.svg").'"
alt="'.htmlspecialchars("don't").'">';
echo $fotoTag1;
答案 5 :(得分:-1)
您应该使用html ascii代码,因此对于您的示例:
$fotoTag2 = "<img src='don't.svg' alt='don't'>";
因为&#39;是单引号的ascii代码。