2016-09-19 2 views
-5

Каков наилучший способ удалить неправильный тег?Лучший способ удалить неправильные теги из строки

Tag неправильно, если он содержится в том же теге

Например, эта линия

<q>+7</q> (<q><q>9</q>6</q><q>2</q>) <q>9</q><q>3</q><q>7</q> <q>4</q><q>2 2</q><q>4</q> 

После удаления неправильных тегов:

<q>7</q> (<q>96</q><q>2</q>) <q>9</q><q>3</q><q>7</q> <q>4</q><q>2 2</q><q>4</q> 

Больше, чем этот простой пример:

До:

<p>bla-bla <p>bla-bla</p> bla-bla</p> 

После:

<p>bla-bla bla-bla bla-bla</p> 
+2

Возможно, вы должны указать http://htmlpurifier.org/. – jeroen

+1

Вы должны использовать синтаксический анализатор XML (в PHP у вас есть [DOMDocument] (http://php.net/dom)), если * неверно * вы имеете в виду * неправильно в соответствии со спецификацией X/HTML *. – Sherif

+0

Кроме того, для того, что стоит любой совместимый анализатор XML, эти теги будут приниматься. Он просто не будет делать с этим то, что вы ожидаете, потому что такие языки, как HTML, непродуманны по дизайну. Согласно спецификации, '

Foo бара

Баз

' только приведет '

обув

бара

База

'. Он предполагает, что то, что вы * подразумевали *, было закрыто первым абзацем абзаца перед тем, как открыть новый. Так оно и делает для вас неявно. – Sherif

ответ

0

Этот вопрос в значительной степени охватывает все, что вам нужно знать: RegEx match open tags except XHTML self-contained tags

Длинные и короткие его: Вы не можете использовать регулярные выражения для этого. Вы «могли», но это было бы настолько сложно, что это создавало бы проблемы в другом месте вашего кода. Либо обрежьте свою кодовую базу, запустите очиститель html, синтаксический анализатор xml или что-то еще по этим строкам. Regex, скорее всего, неправильное решение для вашей проблемы.

+1

Если вы считаете, что этот вопрос является дубликатом, просто отметьте его как таковой. Отправка ссылки на другой вопрос в качестве ответа просто добавляет беспорядок. –

0

вы можете использовать этот шаблон:

(<(.+)>)(.+?)(<\2>)(.*?)(<\/\2>)(.*?)(<\/\2>)$ 

и заменить строку для

$1$3$5$7$8 

Я считаю, что вы можете сделать, как это на PHP

echo preg_replace("(<(.+)>)(.+?)(<\\2>)(.*?)(<\\/\\2>)(.*?)(<\\/\\2>)$", "$1$3$5$7$8", "<p>bla-bla <p>bla-bla</p> bla-bla</p>"); 

вы можете увидеть живой пример этого регулярного выражения, работающего здесь http://regexr.com/3e8o3

Важное замечание состоит в том, что вам может понадобиться вызывать это в цикле while до тех пор, пока регулярное выражение перестанет соответствовать, потому что это регулярное выражение не является рекурсивным, поэтому это не будет работать для 3 или более уровней вложенности.

Смежные вопросы