Bem, abaixo está um código rapidamente lançado que parece funcionar bem para o exemplo de dados simples . Faça o que quiser com isso.
Sim, isso não é algo que você possa fazer com um simples "Localizar e substituir no bloco de notas", mesmo o Regex disponível em F & R em N ++ não oferece a capacidade de fazer isso ... ou é possível em Regex - Está bem além do meu nível. ;)
import sys
import re
def get_tag():
buffer = ""
while True:
c = sys.stdin.read(1)
if not c:
sys.stderr.write("Unexpected EOF\n")
break
buffer += c
if c == '"' or c == "'":
buffer += get_string(c)
if c == '>':
break
return buffer
def get_string(quote = '"'):
buffer = ""
while True:
c = sys.stdin.read(1)
if not c:
sys.stderr.write("Unexpected EOF\n")
break
buffer += c
if c == quote and buffer[-2] != '\':
break
return buffer
buffer = ""
skip_depth = 0
ul_begin = re.compile(r"<\s*li(?:>|\s+.*>)", re.IGNORECASE | re.DOTALL)
ul_begin_share = re.compile(r"<\s*li\s+.*class\s*=\s*([\"'])(?:[^]*?\s+)?share(?:\s+[^]*?)?().*?>", re.IGNORECASE | re.DOTALL)
ul_end = re.compile(r"</\s*li\s*>", re.IGNORECASE)
while True:
if skip_depth < 0:
skip_depth = 0
c = sys.stdin.read(1)
if not c:
#sys.stderr.write("EOF\n")
break
if c == '<':
buffer = c + get_tag()
if skip_depth > 0 and ul_begin.match(buffer):
skip_depth += 1
elif ul_begin_share.match(buffer):
skip_depth += 1
elif ul_end.match(buffer):
skip_depth -= 1
if skip_depth == 0:
continue
c = buffer
if skip_depth > 0:
pass
else:
sys.stdout.write(c)
Teste dados em data.html:
<ul>
<li>do not touch that</li>
<li id="whatever1">or that</li>
<li class="share">delete this</li>
<li class="foo-bar share">delete this</li>
<li class="foobar share foo-bar_">delete this</li>
<li class='share'>delete this</li>
<li class='"wtf" share'>delete this</li>
<li class=" share ">delete this</li>
<li class=" share ">delete this</li>
<li class="foo share">delete this</li>
<li class="share bar">delete this</li>
<li class="foo share bar">delete this</li>
<li class="long foo share short bar">delete this</li>
<li class=" share ">delete this</li>
<li class=" foo share bar ">delete this</li>
<!-- but leave <li class="share">this comment</li> alone -->
<li>This will stay</li>
<li class="share">
<li>delete this</li>
<li>delete this</li>
</li>
<li style="not !important" class="share">delete this</li>
<li>leave this, but
<li class="share">
<li>delete this</li>
<li>delete this</li>
<li>delete this</li>
<li>delete this</li>
</li>
</li>
<li class=" foo share bar ">delete this</li>
<li class="shared">Can't touch this, naaaa-nanana...</li>
</ul>
<em>blablabla</em>
Exemplo de execução:
$ python test.py < data.html > data.corrected.html
$ cat data.corrected.html
<ul>
<li>do not touch that</li>
<li id="whatever1">or that</li>
<!-- but leave <li class="share">this comment</li> alone -->
<li>This will stay</li>
<li>leave this, but
</li>
<li class="shared">Can't touch this, naaaa-nanana...</li>
</ul>
<em>blablabla</em>