PHP Regulärer Ausdruck - Wiederholte Übereinstimmung einer Gruppe

8

Ich habe eine Zeichenfolge, die etwa so aussieht:

%Vor%

Hier ist der reguläre Ausdruck, den ich bisher benutzt habe:

%Vor%

Ich möchte, dass der reguläre Ausdruck innerhalb von () weiterhin Übereinstimmungen mit dem +? am Ende erzeugt. Aber es wird es einfach nicht tun. :: seufzen ::

Irgendwelche Ideen. Ich weiß, dass es einen Weg geben muss, dies in einem regulären Ausdruck zu tun, anstatt ihn aufzubrechen.

    
Senica Gonzalez 05.02.2010, 03:56
quelle

4 Antworten

5

Versuchen:

%Vor%

Ausgabe:

%Vor%

BEARBEITEN:

Da Sie die Zeichenfolge "Filed under" in die Suche einfügen möchten, um die Übereinstimmung eindeutig zu identifizieren, können Sie dies versuchen, ich bin mir nicht sicher, ob dies mit einem einzigen Aufruf von preg_match

erledigt werden kann %Vor%     
codaddict 05.02.2010, 04:17
quelle
8

Nur zum Spaß hier ist ein Regex, der mit einem einzigen preg_match_all funktioniert:

%Vor%

Oder in einem besser lesbaren Format:

%Vor%

\G entspricht der Position, an der der nächste Spielversuch beginnen würde. Dies ist normalerweise die Stelle, an der die vorherige erfolgreiche Spielrunde endete (wenn aber die vorherige Spielrunde die Länge null hatte, springt sie weiter vor). Das bedeutet, dass die Regex keiner Teilzeichenfolge entspricht, die mit </a> beginnt, bis nachdem sie mindestens einmal mit Filed under: übereinstimmt.

Nachdem die Sentinel-Zeichenfolge oder ein End-Tag abgeglichen wurde, verbraucht [^<>]*+<a[^<>]*+> alles bis einschließlich des nächsten Start-Tags. Dann täuscht \K die Startposition vor, so dass die Übereinstimmung (falls es eine gibt) nach dem <a> -Tag zu beginnen scheint (es ist wie ein positiver Lookbehind, aber flexibler). Schließlich stimmt [^<>]+ mit dem Inhalt des Tags überein und bringt die Übereinstimmungsposition bis zum Ende-Tag, so dass \G übereinstimmen kann.

Aber wie gesagt, das ist nur zum Spaß. Wenn Sie nicht haben, um den Job in einem Regex zu erledigen, ist es besser, wenn Sie einen mehrstufigen Ansatz wie das verwendete @codadict verwenden; es ist lesbarer, flexibler und wartbarer.

\K reference
\G reference

EDIT: Obwohl die Referenzen, die ich angegeben habe, für die Perl-Dokumente gelten, werden diese Features auch von PHP unterstützt - genauer gesagt von der PCRE-Bibliothek. Ich denke, die Perl-Dokumente sind ein wenig besser, aber Sie können darüber auch im PCRE-Handbuch nachlesen.

>     
Alan Moore 05.02.2010 09:15
quelle
2
%Vor%

Ausgabe

%Vor%     
ghostdog74 05.02.2010 04:02
quelle
1
  

Ich möchte, dass der reguläre Ausdruck innerhalb von () fortfährt, Übereinstimmungen zu erzeugen, die mit dem + bezeichnet sind. am Ende.

+? ist ein fauler Quantor - es wird so wenig wie möglich entsprechen. Mit anderen Worten, nur einmal.

Wenn Sie mehrere Übereinstimmungen wünschen, möchten Sie einen gierigen Quantifizierer - + .

Beachten Sie auch, dass Ihre Regex nicht ganz funktioniert - die Übereinstimmung schlägt fehl, sobald das Komma zwischen den Tags gefunden wird, weil Sie es nicht berücksichtigt haben. Das muss wahrscheinlich korrigiert werden.

    
Anon. 05.02.2010 04:01
quelle

Tags und Links