2016-10-31 2 views
0

ich diesen Beispielcode haben:Muster für bekommen alle Tags

<ul><li><a href="http://www.example.com/aaa" class="tag">aaa</a></li><li><a href="http://www.example.com/bbb" class="tag">bbb</a></li><li><a href="http://www.example.com/ccc" class="tag">ccc</a></li></ul> 

I aaa, bbb, ccc Tags erhalten müssen, und ich schrieb dieses Muster:

/<a .* class=\"tag\">(.*?)<\/a>/ 

Aber diese Rückkehr zu falschen Ergebnissen . Sie können das Ergebnis here sehen.

Was passiert und wie kann ich es lösen?

+1

Fügen Sie ein Fragezeichen nach dem ersten Sternchen ein: '/ (. *?) <\/a>/'. Sie können weiter darüber nachforschen, indem Sie [gierig und faul] (http://stackoverflow.com/questions/2301285/what-do-lazy-and-greedy-mean-in-the-context-of-regular-expressions) suchen regex auf google – Rodolfo

+0

@Rodolfo Danke, ich benutze '?' im zweiten Teil, aber ich habe den Gebrauch im ersten Teil vergessen. Warum postest du nicht als Antwort ?! –

Antwort

3

Sie haben Ihre zweite .* nicht gierig, aber nicht Ihre erste. Wegen dieses gierigen Matchings passte alles von der Eröffnung <a bis zum Ende der dritten Eröffnung <a. Die einfache Lösung ist die erste nicht-gierig zu machen:

<a .*? class=\"tag\">(.*?)<\/a> 

Hier ist die aktualisierte regex101.

Das heißt, je nachdem, was Sie in Ihrer Sprache der Wahl zur Verfügung haben, und ob Sie jemals eine (auch sehr geringfügig) andere HTML-Zeichenfolge erwarten, könnte ein HTML-Parser eine bessere Wahl sein.