Объединить несколько строк HTML в одном с PHP? Линейные разрывы, вызванные метками P и BR

Первая часть вопроса: p tag

У меня есть строка, содержащая текст с ненужными разрывами строк, вызванными 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 

попробуйте использовать 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); 

и для БР

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

EDIT Heres, почему ваше регулярное выражение работает (надеюсь, чтобы вы могли понять это немного :)):

 /((\\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 

Каждое выражение регулярного выражения должно начинаться и заканчиваться одним и тем же символом. В этом случае я использовал символ косой черты.

(Символ обозначает блок выражения (для замены). Символ Newline равен \n . Так как обратная косая черта используется в качестве escape-символа в регулярном выражении, вам нужно будет избежать этого: \\n .

Строковый символ – \s . Это приведет к поиску строки. Символ * означает поиск 0 или более предшествующего выражения, в этом случае search for zero or more strings: \s* .

Символы + ищут ОДИН или больше предшествующего выражения. В этом случае предыдущее выражение равно (\\n\s*) , поэтому до тех пор, пока это выражение будет найдено один или несколько раз, функция preg_replace найдет что-то.

Флаги, которые я использовал i и m означают случай * I * nsensitive, (на самом деле не нужен для выражения новой строки) и * M * ultiline – это означает, что выражение может проходить через несколько строк кода, а не код, который должен быть на одной линии.