Escaping <br />


Escaping <br />

我试图在我的Magento元描述中逃避<br />之类的东西。

所以我想出了这个:

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

唯一转义的字符是"br/",但剩下的是"<>"

怎么办?

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

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

该表达式解释道:

  • '<br字符串<br的文本匹配
  • 'b是一个单词边界preg_match('/foo'bbar/', 'foobar')不会匹配,但preg_match('/foo'bbar/', 'foo bar')匹配。也就是说,本质上是一个词边界。单词的开头和结尾
  • [^>]*匹配文字>之外的所有查雷反应器。星号表示此字符类可能出现零次或多次:例如,对于<br />,此字符类将匹配/(所有空格和正斜杠。鉴于此:<br>,则此部分将被跳过(出现零次)
  • >是紧密标记>字符的垃圾匹配

如果您的标记有效(即格式不正确),则此表达式将删除您不想删除的任何内容。但是给定这样的字符串: <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标记的结尾进行匹配。但这只是编写标记的人的"错"......

一个鲜为人知的事实是,preg_*函数可以使用匹配的括号(括号、正方形、大括号或角度)作为分隔符。这特别有用,因为这意味着您不必在正则表达式本身中转义这些括号。就个人而言,我喜欢使用括号,因为这有助于我记住匹配数组的"索引 0"表示整个匹配。

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

请改用str_replace。常量字符串不需要preg_*

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

试试这个正则表达式:

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

改编自 php 文档中的注释。

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

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

该函数还接受第二个参数

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