非常混乱(和令人愤怒)的PHP / HTML问题

时间:2014-06-11 07:31:23

标签: php html

我最近遇到了一些极其令人困惑的问题。

例如我会有一个代码。像这样:

  echo "<ID>" . $daten->Firma_ID . "</ID><Name>" 
  . str_replace(array("&", "<", ">", "\"", "'"), 
  array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), 
  $daten->Name_1. ' '. $daten->Name_2.", ". $daten->Ort) 
  ."</Name>";

这是为了将字符串中的符号转义为HTML代码。 (&amp; - &gt;&amp; amp;)

现在这个输出我的字面意思是“&amp; amp;”。有时。

在代码中我使用相同的方法(完全相同的代码),只是它在那里工作得很好。这真是令人沮丧。

这有什么理由吗?此外,这种情况发生在所有浏览器上(经过测试的IE,Chrome和Firefox)

编辑:有趣的是,如果我将&amp; amp改为像&amp; szlig(ß)这样的东西也可以。这似乎只发生在特定时间的&amp; amp。

2 个答案:

答案 0 :(得分:4)

你正在重新发明轮子 - 只需使用:

$str_with_entities = htmlentities($str);

正如documentation所说。

如果您希望浏览器显示$amp;

,您也可以嵌套此通话
$str_with_entities = htmlentities(htmlentities($str));

答案 1 :(得分:3)

转义HTML输出的正确方法是使用htmlspecialchars()

$id = $daten->Firma_ID;
$name = "{$daten->Name_1} {$daten->Name_2} {$daten->Ort}";

printf('<ID>%s</ID><Name>%s</Name>',
  htmlspecialchars($id, ENT_QUOTES, 'UTF-8'),
  htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
);

使用printf()是我个人的偏好,可以让我的代码更清晰。