2009-05-22 3 views
4

Я использую TinyMCE (WYSIWYG) в качестве редактора по умолчанию в одном из моих проектов, и иногда он автоматически добавляет <p>&nbsp;</p> , <p> </p> или div.Regexp для очистки пустых ненужных тегов HTML

Я искал, но не смог найти хороший способ очистки любых пустых тегов с помощью регулярных выражений.

код Я пытался используется,

$pattern = "/<[^\/>]*>([\s]?)*<\/[^>]*>/"; 
$str = preg_replace($pattern, '', $str); 

Примечание: Я также хочу, чтобы очистить & NBSP тоже :(

ответ

6

Попробуйте /<(\w+)>(\s|&nbsp;)*<\/\1>/ вместо :)

+0

ли вы замените пробела во втором аргументе preg_replace()? – pix0r

+0

Вы можете использовать \ 2 (или $ 2, я забыл синтаксис в PHP), чтобы вставить пробел между тегами. – 2009-05-23 09:51:17

1

Это. regexp немного странно - но похоже, что это может сработать. Вы можете попробовать это вместо:

$pattern = ':<[^/>]*>\s*</[^>]*>:'; 
$str = preg_replace($pattern, '', $str); 

Очень похоже.

+1

Удаление белого пространства может быть отличной идеей. Вы, вероятно, не хотите «Hello мир», чтобы стать «Helloworld». –

0

Я знаю, что это не так, как вы просили, но после нескольких месяцев TinyMCE, справляясь не только с этим, но и с адом, который возникает у пользователей, отправляемых непосредственно из Word, я перешел на FCKeditor и не мог быть более счастливым ,

РЕДАКТИРОВАТЬ: На всякий случай неясно, что я говорю, что FCKeditor не вставляет произвольные парасы, где это похоже, плюс справляется со вставленным Word дерьмом из коробки. Вы можете найти мой previous question.

0

Вам нужно, чтобы несколько Regexes были уверены, что вы не устранили другие разыскиваемые элементы с одним общим.

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

<\s*[^>]*>\s*`&nbsp;`\s*<\s*[^>]*> 
<\s*p\s*>\s*<\s*/p\s*> 
<\s*div\s*>\s*<\s*/div\s*> 
+1

Нет необходимости в нескольких регулярных выражениях, вы можете просто сделать /<(p|div)> (\ s |  ) * <\/\1>/ вместо. Добавить имена тегов как соответствующие. – 2009-05-23 09:49:35

0

Попробуйте это:

<([\w]+)[^>]*?>(\s|&nbsp;)*<\/\1> 
Смежные вопросы