2013-09-23 3 views
0

Я пытаюсь убежать <br /> и подобных в моем мета-описании Magento.Escaping <br />

Так что я придумал это:

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

но единственные персонажи Thats сбежавшие является "Бр /", но остальные это "<>"

Что делать?

+1

Похожий вопрос уже ответил http://stackoverflow.com/questions/1778994/how-to-remove-br-tags- and-more-from-a-string – geekdev

ответ

0

Возможно, это стоит выстрел (примечание: непроверенный)

$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 &gt; was omitted</p> 

Регулярное выражение будет соответствовать открытию <br, то [^>]* будет соответствовать:

/The closing &gt; was omitted</p 

только в соответствии с > из </p> в качестве конца тега br. Но это только «вина» от того, кто написал разметку ...

+0

Это сработало. Но я действительно не понимаю, почему, и если это может вызвать проблемы при удалении других элементов, я действительно не хотел удалять. –

+0

@AndersJytzler: Я объяснил регулярное выражение, но при разрыве/удалении некоторых данных. Это редкие, маловероятные случаи. Даже если вы столкнетесь с ними, это просто ужасная практика, IMHO –

+0

@AndersJytzler: Если бы этот ответ решил вашу проблему, было бы неплохо увидеть, что это принято –

0

Это малоизвестный факт, что функции preg_* могут использовать соответствующие скобки (круглые скобки, квадраты, скобки или угол) в качестве разделителей. Это особенно полезно, так как это означает, что вам не нужно избегать этих скобок внутри самого регулярного выражения. Лично мне нравится использовать круглые скобки, так как это помогает мне помнить, что «индекс 0» массива совпадений соответствует всему совпадению.

В любом случае, в этом случае ваши угловые скобки используются в качестве разделителей, в результате чего выражение ищет br /, br и br/.

Вместо этого используйте str_replace. Для постоянных строк вам не нужно preg_*.

РЕДАКТИРОВАТЬ: При этом вы используете htmlspecialchars. В дополнение к использованию str_replace, убедитесь, что вы используете замену перед тем вы искажать HTML;)

+0

На самом деле 'preg_' будет лучше соответствовать, поскольку могут появиться такие вещи, как'
'(много пробелов). –

+0

@AlmaDoMundo Но опять-таки так можно было бы '
'и все его возможные перестановки. Поэтому мы не используем регулярное выражение для анализа HTML. –

+0

Да, да. Однако '/ \ ] \ /? \> /' - простое решение. Но разбор HTML с регулярным выражением? Нет, это плохая идея, я согласен. –

0

Попробуйте это регулярное выражение:

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

Адаптировано из comment in the php docs.

+0

Как это будет реагировать на '
'? –

0

Поскольку вы избегаете строки, используемой в качестве мета-описания, вы должны рассмотреть возможность использования strip_tags, чтобы удалить все теги html.

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

Функция также принимает второй аргумент,

// strips every tag except <a> and <p> 
$description = strip_tags($this->getDescription(), "<a><p>"); 
Смежные вопросы