Regex: mehrere Attributwerte aus einem Tag lesen

Hallo,

ich will aus einem Tag verschiedene Attributwerte ("alt" und "title")
auslesen. Ich bekomme mit meinem regex aber immer nur das erste zu fassen:

preg_match('/(alt|title)[ ]*=[ ]*("[^">]*"|\'[^\'>]*\'|[^ >]*)/i', '<img
alt="bildalt" title="bildtitle" src="somefile.jpg" />', $regs);

Die Attributreigenfolge ist natürlich zufällig. D.h. es könnte auch
title vorne stehen.

Die einzige Lösung, die mir bisher eingefallen ist, wäre jede mögliche
Abfolge im Pattern nachzubilden (was bei 2 Attributen ja noch vertretbar
wäre). Aber schön ist das auch nicht...

Danke für eure Hilfe!

Gruß
David
David Fuhr [ Mo, 24 September 2007 16:05 ] [ ID #1828202 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

David Fuhr schrieb:

>Ich bekomme mit meinem regex aber immer nur das erste zu fassen:

Mit preg_match_all kriegst du beide, wenn auch in etwas gewöhnungsbedürftiger
Form.

Dieses könntest du dann z.B. mit
foreach($regs[1] as $index => $key)
{
$attr[$key] = $regs[2][$index];
}

in eine brauchbarere Darstellung transformieren.

--
Wolfgang Fellger
Wolfgang Fellger [ Mo, 24 September 2007 16:35 ] [ ID #1828203 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

David Fuhr schrieb:
> ich will aus einem Tag verschiedene Attributwerte ("alt" und "title")
> auslesen. Ich bekomme mit meinem regex aber immer nur das erste zu fassen:
>
> preg_match('/(alt|title)[ ]*=[ ]*("[^">]*"|\'[^\'>]*\'|[^ >]*)/i', '<img
> alt="bildalt" title="bildtitle" src="somefile.jpg" />', $regs);

Auszug aus der Beschreibung für "preg_match()" von php.net:

preg_match() gibt die Anzahl der Übereinstimmungen mit Suchmuster
zurück. Das ist entweder 0 (keine Übereinstimmung) oder 1, weil
preg_match() die Suche nach der ersten Übereinstimmung beendet. Im
Gegensatz dazu setzt preg_match_all() die Suche bis zum Ende von
Zeichenkette fort. preg_match() gibt FALSE zurück, falls ein Fehler
auftrat.

Daher einfach mal mit "preg_match_all()" probieren.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 24 September 2007 16:36 ] [ ID #1828204 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

Wolfgang Fellger schrieb:

> David Fuhr schrieb:
>
>> Ich bekomme mit meinem regex aber immer nur das erste zu fassen:
>
> Mit preg_match_all kriegst du beide, wenn auch in etwas gewöhnungsbedürftiger
> Form.

Das ist schon mal gut :) Danke! Das heisst aber, wenn ich aus dem
gesamten HTML-Dokument alle Werte aller title- und alt-Tags auslesen
will, muss ich dazu zweimal preg_match_all() machen.
Einmal auf das gesamte Dokument um alle HTML-Tags zu bekommen die
wenigstens eines der beiden enthalten...

$html = implode("", file("somefile.html"));
preg_match_all('/<[^>]+((alt|title)[ ]*=[^>]*>/i', $html, $matches);

.... und anschließend durch die gefundenen $matches nochmal mit
preg_match_all() schleifen:

foreach ($matches[0] as $match) {
preg_match_all('/(alt|title)[ ]*=[ ]*("[^">]*"|\'[^\'>]*\'|[^ >]*)/i',
'<img alt="bildalt" title="bildtitle" src="somefile.jpg" />', $regs);
// do something with $regs...
}

oder weiß da jemand einen schnelleren/einfacheren weg?

Danke!

Gruß
David
David Fuhr [ Mo, 24 September 2007 18:18 ] [ ID #1828205 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

David Fuhr schrieb:
> Das ist schon mal gut :) Danke! Das heisst aber, wenn ich aus dem
> gesamten HTML-Dokument alle Werte aller title- und alt-Tags auslesen
> will, muss ich dazu zweimal preg_match_all() machen.
> Einmal auf das gesamte Dokument um alle HTML-Tags zu bekommen die
> wenigstens eines der beiden enthalten...
> ...
> und anschließend durch die gefundenen $matches nochmal mit
> preg_match_all() schleifen:
> ...
> oder weiß da jemand einen schnelleren/einfacheren weg?

letzteres sollte doch ausreichen. Brauchst doch nicht noch zusätzlich
die Tags raus suchen wenn direkt die Werte innerhalb der Tags holen
kannst in einem Rutsch.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 24 September 2007 18:27 ] [ ID #1828206 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

Christoph Herrmann schrieb:
>
> letzteres sollte doch ausreichen. Brauchst doch nicht noch zusätzlich
> die Tags raus suchen wenn direkt die Werte innerhalb der Tags holen
> kannst in einem Rutsch.

Dann kommen aber auch alle Vorkommnisse außerhalb von Tags mit, die ich
gar nicht will. Wenn irgendein Spaßvogel

<p>Title geht mit title="text" im Element</p>

schreibt würde das sonst auch als Attribut erkannt werden.

Und wenn ich das "<"-Zeichen im Pattern verwende, habe ich wieder das
Problem vom Anfang:

preg_match_all('/<[^>]+?((alt|title)[ ]*=[ ]*("[^">]*"|\'[^\'>]*\'|[^
>]*))+[^>]*>/i', $html, $matches);

Gruß
David
David Fuhr [ Mo, 24 September 2007 18:45 ] [ ID #1828208 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

David Fuhr wrote:

>> letzteres sollte doch ausreichen. Brauchst doch nicht noch zusätzlich
>> die Tags raus suchen wenn direkt die Werte innerhalb der Tags holen
>> kannst in einem Rutsch.
>
> Dann kommen aber auch alle Vorkommnisse außerhalb von Tags mit, die
> ich gar nicht will. Wenn irgendein Spaßvogel
>
> <p>Title geht mit title="text" im Element</p>
>
> schreibt würde das sonst auch als Attribut erkannt werden.
>
> Und wenn ich das "<"-Zeichen im Pattern verwende, habe ich wieder das
> Problem vom Anfang:

Gibts was gegen:

$xml = simplexml_load_string('<xml>' . $string . '</xml>');
print_r($xml);

einzuwenden?

Gruß
Johannes

--
Emails ohne "[nospam]" im Betreff werden kommentarlos gelöscht.
Johannes Mueller [ Mo, 24 September 2007 19:04 ] [ ID #1828210 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

Johannes Mueller schrieb:
>
> Gibts was gegen:
>
> $xml = simplexml_load_string('<xml>' . $string . '</xml>');
> print_r($xml);
>
> einzuwenden?

Ja, die fehlende PHP4-Kompatibilität. ;) Trotzdem danke :)

Gruß
David
David Fuhr [ Mo, 24 September 2007 19:10 ] [ ID #1828211 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

David Fuhr wrote:

> Das ist schon mal gut :) Danke! Das heisst aber, wenn ich aus dem
> gesamten HTML-Dokument alle Werte aller title- und alt-Tags auslesen
> will, muss ich dazu zweimal preg_match_all() machen.

Wo siehst Du da ein Problem? Reguläre Ausdrücke unter PHP sind enorm
schnell.

Als Alternative könntest Du wenn zugänglich und einkompiliert PHPs DOM
interface nutzen. Aber wenns um Prformance geht ist das die schlechteste
Wahl.

MfG, Ulf

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ Mo, 24 September 2007 19:57 ] [ ID #1828214 ]

Re: Regex: mehrere Attributwerte aus einem Tag lesen

Am Mon, 24 Sep 2007 19:10:15 +0200 schrieb David Fuhr:

> Johannes Mueller schrieb:
>>
>> Gibts was gegen:
>>
>> $xml = simplexml_load_string('<xml>' . $string . '</xml>');
>> print_r($xml);
>>
>> einzuwenden?
>
> Ja, die fehlende PHP4-Kompatibilität. ;) Trotzdem danke :)

Irrelevant...

Schon gehört?

| PHP 4 end of life announcement [13-Jul-2007]
|
| Today it is exactly three years ago since PHP 5 has been released. In
| those three years it has seen many improvements over PHP 4. PHP 5 is
| fast, stable & production-ready and as PHP 6 is on the way, PHP 4 will
| be discontinued.
|
| The PHP development team hereby announces that support for PHP 4 will
| continue until the end of this year only. After 2007-12-31 there will be
| no more releases of PHP 4.4. We will continue to make critical security
| fixes available on a case-by-case basis until 2008-08-08. Please use the
| rest of this year to make your application suitable to run on PHP 5.
|
| For documentation on migration for PHP 4 to PHP 5, we would like to
| point you to our migration guide. There is additional information
| available in the PHP 5.0 to PHP 5.1 and PHP 5.1 to PHP 5.2 migration
| guides as well.
Norbert Melzer [ Fr, 05 Oktober 2007 21:52 ] [ ID #1837613 ]
PHP » de.comp.lang.php.misc » Regex: mehrere Attributwerte aus einem Tag lesen

Vorheriges Thema: Fehlermeldung bei Verzeichnis löschen rmdir, selber schreiben
Nächstes Thema: kann mittels mkdir zar Ordner erstellen doch nicht die richtigen Rechte setzen