Возможно, это стоит выстрел (примечание: непроверенный)
$desc = preg_replace('/\<br\b[^>]*>/i', ' ', $this->getDescription());
Выражение объяснена:
\<br
является буквальным совпадением для строка<br
\b
является граница слова: preg_match('/foo\bbar/', 'foobar')
не будет соответствовать, но preg_match('/foo\bbar/', 'foo bar')
будет матч. То есть, по существу, граница слов. Начало и окончание слова
[^>]*
спички все chareacters кроме для буквального >
. Звездочка заявляет, что этот класс класса может иметь место ноль или более: с <br />
, например, этот класс char будет соответствовать /
(все пробелы и косая черта.Учитывая это: <br>
, то эта часть будет пропущена (происходит ноль раз)
>
является litteral матча за крупный тэг >
полукокса
Если разметка действует (т.е. не уродливы), это выражение удалит все, что вы не хотите удалить. Но при заданных строках вот так: <br data-string="<b>Don't include markup here</b>"/>
это выражение не будет выполнено: есть свойство, содержащее разметку, но это то, что я лично считаю отвратительным. Вы не включаете разметку в атрибут тега, IMO.
Другой случай, когда регулярные выражения позволяет охраннику вниз при столкновении с искаженной разметки:
<br/The closing > was omitted</p>
Регулярное выражение будет соответствовать открытию <br
, то [^>]*
будет соответствовать:
/The closing > was omitted</p
только в соответствии с >
из </p>
в качестве конца тега br
. Но это только «вина» от того, кто написал разметку ...
Похожий вопрос уже ответил http://stackoverflow.com/questions/1778994/how-to-remove-br-tags- and-more-from-a-string – geekdev