Первая часть вопроса: p tag
У меня есть строка, содержащая текст с ненужными разрывами строк, вызванными p-тегами, например:
<p>hi everyone,</p> <p> </p> <p> </p> <p> </p> <p>Here comes the content I wanted to write...</p>
Я хотел бы отфильтровать эти пустые теги p и объединить их в один:
<p>hi everyone,</p> <p> </p> <p>Here comes the content I wanted to write...</p>
Как это может быть сделано?
Спасибо!
Вторая часть вопроса: ярлык br
Иногда строка содержит br-теги, которые также вызывают разрывы строк, например:
that is all I wanted to write.<br /> <br /> <br /> <br /> <br /> <br /> bye
Это должно стать:
that is all I wanted to write.<br /> <br /> bye
попробуйте использовать str_replace
$content = str_replace(array("<p> </p>\n", " <br />\n"), array('', ''), $content);
Чтобы использовать регулярное выражение:
$content = preg_replace('/((<p\s*\/?>\s*) (<\/p\s*\/?>\s*))+/im', "<p> </p>\n", $content);
и для БР
$content = preg_replace('/( (<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 – это означает, что выражение может проходить через несколько строк кода, а не код, который должен быть на одной линии.