逃离<br/>

时间:2013-09-23 09:37:38

标签: php escaping

我正试图在我的Magento元描述中逃避<br />和喜欢。

所以我想出了这个:

$characters = array("<br />", "<br>", "<br/>");
$badDesc = htmlspecialchars($this->getDescription());
$goodDesc = preg_replace($characters, ' ', $badDesc);

但唯一被转义的字符是“br /”,但剩下的是“&lt;&gt;”

做什么?

4 个答案:

答案 0 :(得分:0)

一个鲜为人知的事实是preg_*函数可以使用匹配括号(圆括号,方括号,大括号或角度)作为分隔符。这特别有用,因为它意味着您不必在正则表达式内部转义那些括号。我个人喜欢使用括号,因为这有助于我记住匹配数组的“索引0”代表整个匹配。

无论如何,在这种情况下,您的尖括号被用作分隔符,使表达式搜索br /brbr/

请改用str_replace。对于常量字符串,您不需要preg_*

编辑:那就是说,你首先使用的是htmlspecialchars。除了使用str_replace之外,请确保在之前使用替换来破坏HTML;)

答案 1 :(得分:0)

试试这个正则表达式:

$desc = preg_replace('/\<br(\s.*)?\/?\>/i', " ", $this->getDescription());

改编自comment in the php docs

答案 2 :(得分:0)

由于您要转义字符串以用作元描述,因此您应该考虑使用strip_tags删除所有html标记。

$description = strip_tags($this->getDescription());

该函数还采用第二个参数

// strips every tag except <a> and <p>
$description = strip_tags($this->getDescription(), "<a><p>");

答案 3 :(得分:0)

也许这值得一试(注意:未经测试)

$desc = preg_replace('/\<br\b[^>]*>/i', ' ', $this->getDescription());

表达解释:

  • \<br字符串的文字匹配 <br
  • \b字边界preg_match('/foo\bbar/', 'foobar')不匹配,但preg_match('/foo\bbar/', 'foo bar') 匹配。也就是说,本质上是一个词边界。一个词的开头和结尾
  • [^>]*匹配所有 chareacters 以外的文字>。星号表示此字符类可能出现零次或多次:例如,使用<br />,此char类将匹配/(所有空格和正斜杠。这个:<br>,那么这部分将被跳过(发生零次)
  • >是close-tag > char
  • 的最终匹配

如果您的标记有效(即没有格式错误),此表达式将删除您不想删除的任何内容。但是给出这样的字符串:<br data-string="<b>Don't include markup here</b>"/>这个表达式会失败:有一个包含标记的属性,但这是我个人觉得反感的东西。您没有在标签IMO的属性中包含标记 正则表达式让警察失望的另一种情况是遇到格式错误的标记:

<br/The closing &gt; was omitted</p>

正则表达式将与开头<br匹配,然后[^>]*将匹配:

/The closing &gt; was omitted</p

仅匹配> </p>作为br标记的结尾。但这只是编写标记的人的“错误” ......