2013-08-28 4 views
1

У меня есть html в одной строке, которая может иметь или не иметь новые строки. Это может выглядеть примерно так:regex для получения тегов предыдущий и следующий

<table><tr><th>blah1</th></tr><tr><input class="inputClass"><span>open&lt;pfelclose/>pfelsingle'pfeldouble"pfel</span></input></tr></table> 

отформатированный красиво:

<table> 
    <tr> 
    <th>blah1</th> 
    </tr> 
    <tr> 
    <input class="inputClass"> 
     <span>open&lt;pfelclose/>pfelsingle'pfeldouble"pfel</span> 
    </input> 
    </tr> 
</table> 

Я хотел бы искать эту строку для

(open<pfel|close/>pfel|single'pfel|double"pfel) 

, но и получить два открытых метки до и двух близких теги после. Так что я хотел бы получить что-то вроде:

<input class="inputClass"><span>open&lt;pfelclose/>pfelsingle'pfeldouble"pfel</span></input> 

Я не могу предположить, что вход или диапазон будет там, и я не могу предположить, что обязательно два тега до или два тега после.

Моя попытка, кажется, всегда тянуть весь начало строки:

.*[<]{0,2}?(open<pfel|close/>pfel|single'pfel|double"pfel)[/>]{0,2}? 
+6

Никогда не разбирайте html с регулярным выражением. Вместо этого используйте анализаторы HTML. – alecxe

+0

Я бы с удовольствием, но все синтаксические анализаторы html, которые я использую, кодируют одинарные, двойные кавычки и знаки lt gt. – tophersmith116

+1

Вы _want_ '"', чтобы стать '' ', правильно? Если нет, просто замените' '' на '"' после факта. – Taymon

ответ

2

Проблема с вашей ситуации является то, что вы хотите, чтобы найти соответствующие метки (открытые и близкие теги до и после того, как текст, который вы» re поиск). Regex не может сделать это. Он не способен анализировать вложенную структуру, такую ​​как HTML. Regex анализирует регулярные языки, а HTML - не один. Продвинутые двигатели Regex иногда могут быть принуждены к выполнению почти того, что вы пытаетесь сделать здесь, но обычно это больше проблем, чем того стоит.

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

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