2009-02-26 12 views
3

Da ich bei Regex völlig nutzlos bin und mich seit einer halben Stunde belästigt, denke ich, dass ich das hier veröffentlichen werde, da es wahrscheinlich ziemlich einfach ist.Simple RegEx PHP

<a href="/folder/files/hey/">hey.exe</a> 
<a href="/folder/files/hey2/">hey2.dll</a> 
<a href="/folder/files/pomp/">pomp.jpg</a> 

In PHP muss ich extrahieren, was zwischen dem <a> Tags Beispiel ist:

hey.exe 
hey2.dll 
pomp.jpg 

Antwort

6

Vermeiden Sie, auch wenn Sie es ungreedy machen, bis Sie etwas mehr Praxis mit RegEx haben ‚*‘. Ich denke, eine gute Lösung für Sie wäre:

'/<a[^>]+>([^<]+)<\/a>/i' 

Beachten Sie die ‚/‘ Begrenzungszeichen - Sie können die Preg-Suite von Regex-Funktionen in PHP verwenden. Es würde wie folgt aussehen:

preg_match_all($pattern, $string, $matches); 
// matches get stored in '$matches' variable as an array 
// matches in between the <a></a> tags will be in $matches[1] 
print_r($matches); 
+0

+1 für die Empfehlung gegen (. *) und stattdessen die ausschließliche Verwendung von Zeichenklassen. – Tomalak

2

<a href="[^"]*">([^<]*)</a>

2

Ich fand this regular expression tester hilfreich sein.

+0

Noch besser: http://gskinner.com/RegExr/ (Flash-Implementierung, interaktive und alle) – Tomalak

+1

Mein Favorit ist http://rubular.com/ –

+1

Die ICG-Tester ist basierend auf .NET ist RegExr ActionScript und Rubular ist Ruby. Da das OP PHP verwendet, wäre es wahrscheinlich hilfreicher, einen PHP-basierten Tester zu empfehlen. http://www.google.com/search?q=PHP+regex+tester –

2

ist hier sehr einfach:

<a.*>(.*)</a> 

Allerdings sollten Sie vorsichtig sein, wenn Sie mehrere Spiele in der gleichen Zeile haben, z.B.

<a href="/folder/hey">hey.exe</a><a href="/folder/hey2/">hey2.dll</a> 

In diesem Fall wäre die richtige regex sein:

<a.*?>(.*?)</a> 

Hinweis das '?' nach dem '*' Quantifizierer. Standardmäßig sind Quantifizierer gierig, was bedeutet, dass sie so viele Charaktere essen wie sie können (was bedeutet, dass sie in diesem Beispiel nur "hey2.dll" zurückgeben). Indem Sie ein Anführungszeichen anfügen, machen Sie sie ungerecht, was besser zu Ihren Bedürfnissen passen sollte.

2

Dies scheint zu funktionieren:

$pattern = '/<a.*?>(.*?)<\/a>/';