Novato (SO beginner)

4 views
Skip to first unread message

RockBlock

unread,
Jan 11, 2010, 7:04:40 AM1/11/10
to Expressões regulares
Gente sou novato na lista
Quero contrar casar somente a TERCEIRA ocorrência de <a href


aqui no código abaixo
==============================
<ul>
<li>
<div><span><img src="/portal/uploads/20091221232140.jpg"
alt=""></span></div>
<h6>21/12/2009 <!--<em>[11:28h]1</em>--></
h6><br/>
<h3><a href="noticia.php?
cod=3135">Servidores da Assembleia recebem de dezembro nesta
ter&ccedil;a</a></h3>

</li>


<li>
<div><span><img src="/portal/uploads/20091218172728.jpg"
alt=""></span></div>
<h6>18/12/2009 <!--<em>[11:28h]1</em>--></
h6><br/>
<h3><a href="noticia.php?
cod=3134">Assembleia aprova por unanimidade LOA 2010</a></h3>

</li>


<li>
<div><span><img src="/portal/uploads/20091218163931.jpg"
alt=""></span></div>
<h6>18/12/2009 <!--<em>[11:28h]1</em>--></
h6><br/>
<h3><a href="noticia.php?
cod=3133">Presidente Arthur comemora conquistas em 2009</a></h3>

</li>

</ul>
</div>
==============================

utilizei algo do tipo
/<a href=\"{3}/ (em php) e encontrou 0 vezes, mas só quero a terceira
ocorrência
testei {1} e encontrou 3 vezes
...


E ai?
algum bom samaritano pode me ajudar?

Felipe Pena

unread,
Jan 11, 2010, 7:25:25 AM1/11/10
to Expressões regulares

Olá, nesses casos eu acho melhor usar XPath pela SimpleXML do PHP do
que usar regex... Mas se você quer usar regex, você poderia usar algo
como:

preg_match('/<ul>\s*<li>(?:(?!<\/li>).)+<\/li>\s*<li>
\s*<div><span><img src="([^"]+)/s', $html, $match);

PS: A expressão regular acima foi montada baseando-se que o primeiro
<ul><li> encontrado seja o alvo.

caio ariede

unread,
Jan 11, 2010, 8:03:59 AM1/11/10
to expressoes...@googlegroups.com
Como o Felipe disse, a melhor solução é utilizar um analisador próprio.

Diria que ainda, a segunda opção não seria regex, nem tanto pelo fato da performance, mas da leitura do código e manutenção.

Você pode primeiramente processar o texto, usando funções básicas, e posteriormente aplicar a expressão regular, assim você tem uma expressão mais objetiva:

  1     $text = ...;
  2    
  3     $start = 0; $i = 3-1; while (--$i)
  4     {
  5         $start = stripos($text, '<a href', $start+1);
  6     }  
  7
  8     preg_match('!<a[^>]*>(.*)</a>!', substr($text, $start), $match);
  9
 10     var_dump(current($match));

Caio Ariede
http://caioariede.com/


2010/1/11 Felipe Pena <feli...@gmail.com>
--
Você está recebendo esta mensagem porque se inscreveu no grupo "Expressões regulares" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para expressoes...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para expressoes-regul...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/expressoes-regulares?hl=pt-BR.




caio ariede

unread,
Jan 11, 2010, 8:06:07 AM1/11/10
to expressoes...@googlegroups.com
Ali no 3-1 seria 3+1. Esta assim, somente para melhorar a leitura da lógica aplicada.

Caio Ariede
http://caioariede.com/


2010/1/11 caio ariede <caio....@gmail.com>

eli_morais

unread,
Jan 11, 2010, 11:06:34 AM1/11/10
to expressoes...@googlegroups.com
Valeu Caio,
Valeu Felipe...
"brigadaço"!!!


Em 11/01/2010 11:03, caio ariede < caio....@gmail.com > escreveu:


Como o Felipe disse, a melhor solução é utilizar um analisador próprio.

Diria que ainda, a segunda opção não seria regex, nem tanto pelo fato da performance, mas da leitura do código e manutenção.

Você pode primeiramente processar o texto, usando funções básicas, e posteriormente aplicar a expressão regular, assim você tem uma expressão mais objetiva:

  1     $text = ...;
  2    
  3     $start = 0; $i = 3-1; while (--$i)
  4     {

  5         $start = stripos($text, '  6     }  
  7
  8     preg_match('!]*>(.*)!', substr($text, $start), $match);
  9
 10     var_dump(current($match));

Caio Ariede
http://caioariede.com/

2010/1/11 Felipe Pena <feli...@gmail.com>

On 11 jan, 10:04, RockBlock <eli_mor...@uol.com.br> wrote:
> Gente sou novato na lista
> Quero contrar casar somente a TERCEIRA ocorrência de >

> aqui no código abaixo
> ==============================
>                  


>                              

>                                                    
> alt="">

>                            
21/12/2009 <!--[11:28h]1-->> h6>

>                            
Servidores da Assembleia recebem de dezembro nesta

> terça

>
>                                                        


>
>                                      

>                                                    
> alt="">

>                            
18/12/2009 <!--[11:28h]1-->> h6>

>                            
Assembleia aprova por unanimidade LOA  2010

>
>                                                        


>
>                                      

>                                                    
> alt="">

>                            
18/12/2009 <!--[11:28h]1-->> h6>

>                            
Presidente Arthur comemora conquistas em 2009

>
>                                                        


>
>                                        


>                                        

> ==============================
>
> utilizei algo do tipo
> / > ocorrência


> testei {1} e encontrou 3 vezes
> ...
>
> E ai?
> algum bom samaritano pode me ajudar?


Olá, nesses casos eu acho melhor usar XPath pela SimpleXML do PHP do
que usar regex... Mas se você quer usar regex, você poderia usar algo
como:

preg_match('/

\s*


(?:(?!<\/li>).)+<\/li>\s*

\s*



PS: A expressão regular acima foi montada baseando-se que o primeiro

Reply all
Reply to author
Forward
0 new messages