0

我正试图逃避<br />我的 Magento 元描述中的类似内容。

所以我想出了这个:

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

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

做什么?

4

4 回答 4

0

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

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

改为使用str_replace。你不需要preg_*常量字符串。

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

于 2013-09-23T09:40:27.133 回答
0

试试这个正则表达式:

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

改编自php 文档中的评论

于 2013-09-23T09:43:35.810 回答
0

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

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

该函数还接受第二个参数

// strips every tag except <a> and <p>
$description = strip_tags($this->getDescription(), "<a><p>");
于 2013-09-23T09:44:59.520 回答
0

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

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

表达式解释:

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

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

于 2013-09-23T09:45:32.903 回答