1

问题的第一部分:p标签

我有一个字符串,其中包含由 p 标签引起的不必要换行符的文本,例如:

<p>hi everyone,</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Here comes the content I wanted to write...</p>

我想过滤这些空的 p 标签并将它们合并为一个:

<p>hi everyone,</p>
<p>&nbsp;</p>
<p>Here comes the content I wanted to write...</p>

如何才能做到这一点?

谢谢!


问题的第二部分:br 标签

有时字符串包含 br 标记也会导致换行,例如:

that is all I wanted to write.<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
bye

这应该变成:

that is all I wanted to write.<br />
<br />
bye
4

1 回答 1

3

尝试使用 str_replace

$content = str_replace(array("<p>&nbsp;</p>\n", "&nbsp;<br />\n"), array('', ''), $content);

要使用正则表达式:

$content = preg_replace('/((<p\s*\/?>\s*)&nbsp;(<\/p\s*\/?>\s*))+/im', "<p>&nbsp;</p>\n", $content);

对于 BR

$content = preg_replace('/(&nbsp;(<br\s*\/?>\s*)|(<br\s*\/?>\s*))+/im', "<br />\n", $content);

编辑这 就是为什么你的正则表达式有效(希望你能理解一点:)):

/((\\n\s*))+/im
^  ^^^ ^^  ^^^^
|  \|/ ||  ||\|
|   |  ||  || -- Flags
|   |  ||  |-- Regex End Character
|   |  ||  -- One or more of the preceeding character(s)
|   |  |-- Zero or More of the preceeding character(s)
|   |  -- String Character
|   -- Newline Character (Escaped)
-- Regex Start Character

每个正则表达式必须以相同的字符开头和结尾。在这种情况下,我使用了正斜杠字符。

( 字符表示表达式块(要替换) 换行符是\n。因为反斜杠在正则表达式中用作转义字符,所以您需要对其进行转义:\\n

字符串字符是\s. 这将搜索一个字符串。该*字符表示搜索 0 个或多个前面的表达式,在本例中为search for zero or more strings: \s*.

+ 符号搜索一个或多个前面的表达式。在这种情况下,前面的表达式是(\\n\s*),所以只要找到该表达式一次或多次,preg_replace 函数就会找到一些东西。

我使用的标志i表示mcase * I *nsensitive,(换行表达式并不真正需要)和 * M *ultiline - 表示表达式可以跨越多行代码,而不是代码需要在一个线。

于 2013-05-29T08:49:48.297 回答