Pergunta

Eu tenho vontade de melhorar minhas habilidades de regex para algum tempo agora e "Dominando Expressões Regulares" foi recomendado algumas vezes assim que eu comprei e tenho lido sobre isso o dia passado ou assim.

Eu criei a seguinte expressão regular:

^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$

que combina as duas primeiras ligações, mas ignora os dois fechado por uma tag <i>. Ele extrai o id, título e tipo.

<a href="/site.php?id=6321">site 1 title (type 1)</a>
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b>

<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i>
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b>

Embora ele funciona, parece bastante longo para algo tão simples, ele poderia ser melhorado?

Foi útil?

Solução

Se seus screenscrappers escrita como Whilliham legitimamente menciona DOM pode ser apenas um analisador adequado como Regex desde HTML é muito mais perdoando então Regex.

Não encurtado muito, mas um pouco o regex é mais complacente

  • início Removido de corda e no final do cheques de cordas, você realmente precisa -los?
  • lookbehind negativo para se certificar de <a> não é precedido por <i>
  • uso de \ d simples asertation em vez de [0-9] aspirador pouco.
  • Você teve digite 3 a 11 caracteres i mudou para 3 ou mais.
  • cheques removidos para tags de fim não tenham nenhuma significado contextual para o seu screenscrapper (presumivelmente).

(?<!<i>)<a href="/site.php\?id=(\d*)">(.*?) \(([ a-z\d]{2,})\)

Outras dicas

Curto de usar classes de personagens (\ d para 0-9 etc.) Eu não vejo que a expressão regular em questão poderia ser encurtado muito; no entanto ...

Como uma nota lateral, pode valer a pena mencionar que a análise de HTML com expressões regulares é perigoso na melhor das hipóteses; quando se lida com HTML (e, em menor medida XML), ferramentas de DOM são geralmente mais adequadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top