PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Wer kann mir bei diesem regulären ausdruck helfen? (https://www.php-resource.de/forum/php-developer-forum/68373-wer-kann-mir-bei-diesem-regulaeren-ausdruck-helfen.html)

bajana 28-03-2006 07:53

Wer kann mir bei diesem regulären ausdruck helfen?
 
Ich bastle gerade an einem Regulären Ausdruck rum und komme nicht weiter. Ich möchte erkennen, wie oft in einem Text eine Tabelle vor kommt, mit dem Layout wie im Kommentar. Dazu will ich abfragen, wie oft <TABLE (irgendwas außer </TABLE>)</TABLE> vorkommt, weil mit <TABLE.*</TABLE> kommt immer nur 1 als Ergebnis zurück.
Kann mir jemand helfen?
PHP-Code:

/*<TABLE style=\"WIDTH: 335px; HEIGHT: 96px\" cellSpacing=2 cellPadding=2 border=1><TBODY>
<TR>
<TD><BR></TD>
<TD><BR></TD>
</TR><TR>
<TD><BR></TD>
<TD><BR></TD>
</TR>
</TBODY></TABLE>*/
preg_match_all("/<TABLE[^(<\/TABLE>)]*<\/TABLE>/"$text$tabellen);
$anz1 count ($tabellen[0]);
echo 
$anz1


phoboslab 28-03-2006 11:18

das liegt daran, dass dein regexp ( um genau zu sein, das * ) greedy ( gefräßig) ist. es matcht so viel es kann - vom ersten <table> bis zum _letzten_ </table>!
ein fragezeichen sagt dem sternchen das es non-greedy arbeiten soll, also nur so viel matcht, wie es unbedingt muss um das regexp zu erfüllen.

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

prego 28-03-2006 11:22

Naja, das macht nicht das ? sondern der Modifier "U"

PHP-Code:

"/<table[^(</table> )]*</table>/Ui" 

U = Ungreedy
i = case insensitive

bajana 28-03-2006 11:49

Ihr seit spitze! Danke!

closure 28-03-2006 12:02

Zitat:

Original geschrieben von prego
Naja, das macht nicht das ? sondern der Modifier "U"

PHP-Code:

"/<table[^(</table> )]*</table>/Ui" 

U = Ungreedy
i = case insensitive

Beides hat den selben effekt. Siehe auch manpages zu pcre.
Von daher hat phoboslab also ebenso recht.


greets

//EDIT hier der entsprechende auszug aus der manpage
Zitat:

However, if a quantifier is followed by a question mark, it ceases to
be greedy, and instead matches the minimum number of times possible, so
the pattern ...

prego 28-03-2006 13:57

Oh, das war mit neu...

Danke :)

Luke 28-03-2006 15:25

> [^(</table> )]*

geht das wirklich? IMHO nicht, kriegs aber irgendwie auch nicht getestet

bajana 28-03-2006 15:27

Zitat:

Original geschrieben von Luke
> [^(</table> )]*

geht das wirklich? IMHO nicht, kriegs aber irgendwie auch nicht getestet

Ne, das geht nicht, aber mit "/<TABLE.*<\/TABLE>/Ui" gehts.

closure 28-03-2006 15:34

Hi,

phoboslab hat doch schon eine gute lösung gezeigt.
Zu beachten ist, dass hier nested tables nicht so erkannt werden
wie man es vll möchte. Ausserdem sind die modifier s und m notwendig. Optional kann man noch i angeben.

Code:

/<table>(.*?)<\/table>/ims
greets

Luke 28-03-2006 15:39

m? Brauchste doch nicht


Schade dass das mit dem [^(text)] nicht geht, das wär ja die Entdeckung des jahrhunderts

bajana 28-03-2006 15:40

Zitat:

Original geschrieben von closure
Hi,

phoboslab hat doch schon eine gute lösung gezeigt.
Zu beachten ist, dass hier nested tables nicht so erkannt werden
wie man es vll möchte. Ausserdem sind die modifier s und m notwendig. Optional kann man noch i angeben.

Code:

/<table>(.*?)<\/table>/ims
greets
nested Tables wird es nicht geben, verwende bereits die Lösung von oben, trotzdem lief die Diskussion weiter, ist ja auch interessant, noch mehr über das Thema zu wissen, aber was Du über die modifier m und s schreibst verstehe ich nicht, ich habe dazu folgendes auf http://www.php-resource.de/tutorials/read/10/1/ gefunden:

Zitat:

s
Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt

m
Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.

Die Modifier können beliebig kombiniert werden, s und m zusammen machen allerdings wenig Sinn.

Luke 28-03-2006 16:03

Das Tutorial ist voll der Dreck, ließ hier mal:

http://www.php.net/manual/de/referen....modifiers.php

closure 28-03-2006 16:08

Zitat:

s
Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt

m
Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.

Die Modifier können beliebig kombiniert werden, s und m zusammen machen allerdings wenig Sinn.
Hmm das ist mir neu. m sucht über mehre zeilen und s bewirkt dass der punkt-operator auch newlines matched. Wieso schliessen sich
beide aus ? Ich bekomme jedenfalls bei suchen über mehrere zeilen
nur ergebnisse wenn ich beide modifier verwende.


//EDIT nachtrag:
ich will ja nichts sagen, aber das pcre tutorial ist nicht so gut.
hier wieder der auszug aus der manpage
Zitat:

modifier description Perl corresponding

PCRE_CASELESS case insensitive match /i
PCRE_MULTILINE multiple lines match /m
PCRE_DOTALL dot matches newlines /s
greets

wahsaga 28-03-2006 16:27

Zitat:

Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen
Das ist m.E. schlichtweg Quark.

Wie du schon sagtest, sorgt der Modifier s dafür, dass der Punkt auch Newlines matcht. Deshalb ja auch der Name PCRE_DOTALL.
Zitat:

Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.
Auch diese Beschreibung taugt wenig bis gar nichts.

Das PHP-Manual beschreibt es m.E. besser und genauer:
Zitat:

Standardmäßig behandelt PCRE eine zu durchsuchende Zeichenkette wie eine einzige Zeile von Zeichen (auch wenn sie tatsächlich mehrere Zeilenumbrüche enthält). Das Metazeichen für einen Zeilenanfang (^) passt nur auf den Anfang der Zeichenkette, das Metazeichen für ein Zeilenende ($) nur auf das Ende der Zeichenkette (falls der Modifikator D nicht gesetzt ist). [...] Wenn dieser Modifikator gesetzt ist, passen die Zeilenanfang- und Zeilenende-Konstrukte in der Zeichenkette sowohl direkt nach, bzw. vor einem Zeilenumbruch als auch auf deren Anfang und Ende.
Zitat:

Original geschrieben von closure
Wieso schliessen sich beide aus ?
Tun sie nicht.

Sie bewirken beide etwas (größtenteils) unabhängiges.

Auch m als "Komplement" zu s zu bezeichnen, halte ich für Unfug.

closure 28-03-2006 16:38

Zitat:

Original geschrieben von wahsaga
Tun sie nicht.

Sie bewirken beide etwas (größtenteils) unabhängiges.

Auch m als "Komplement" zu s zu bezeichnen, halte ich für Unfug.
Ich hab schon an mir gezweifelt.

greets


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:51 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG