Reguläre Ausdrücke, wie kann ich dsa verstehen ?
3d
- php
Hallo,
Ich will Reguläre Ausdrücke verwenden, aber die kann ich nicht leicht verstehen. Und zwar z.b folgendes
<?php
$zeichenkette = '15. April 2003';
$suchmuster = '/(\d+). (\w+) (\d+)/i';
$ersetzung = '${2}1,$3';
echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
April1,2003
Wie ich verstanden habe:
Suchmuster besteht aus drei Teilen
(\d+) : also 15
(\w+) : April 200
(\d+) : 3
dann Bei der Ersetzung
${2} was bedeutet das? für mich wäre 03 die letzte zwei Ziffern
und dann 1,
und dann $3 bedeutet letzte Referenzierung d.h (\d+) = 3
zusammen kommt für mich 031,3
bestimmte irre ich mich, könnte bitte jemand mir das erklären.
Grüße
Wie ich verstanden habe:
Suchmuster besteht aus drei Teilen
(\d+) : also 15
(\w+) : April 200
(\d+) : 3
dann Bei der Ersetzung
${2} was bedeutet das? für mich wäre 03 die letzte zwei Ziffern
und dann 1,
und dann $3 bedeutet letzte Referenzierung d.h (\d+) = 3
zusammen kommt für mich 031,3
bestimmte irre ich mich, könnte bitte jemand mir das erklären.
Grüße
Hallo!
Die sind auch nicht leicht zu verstehen. Da hilft nur viel Übung - und gute Notizen, wenn Du lange nichts mit machst, vergißt Du sonst die Hälfte wieder.
Ich will´s mal versuchen zu erklären.
$zeichenkette = '15. April 2003';
$suchmuster = '/(\d+). (\w+) (\d+)/i';
\d sucht nach Ziffern.
Ein + bedeutet mindestens einmal, aber beliebig oft soll das Gesuchte vorkommen. Das trifft hier auf 15 zu. Die Klammern um \d+ sorgen dafür, daß das Gefundene intern durchnumeriert wird, angefangen bei 1.
Als nächstes wird . gesucht. Ein . steht für ein beliebiges Zeichen. Wenn man tatsächlich einen Punkt suchen will, muß man das maskieren, was durch den \ geschieht.
Jetzt haben wir
(\d+).
womit wir
15.
finden.
Anschließend wird ein Leerzeichen gesucht.
\w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich), wieder beliebig viele, aber mindestens eins. Da der Ausdruck geklammert ist, kriegt der Fund intern die 2.
Der Rest läuft dann genauso.
i ist noch ein Modifizierer, der dafür sorgt, daß Groß- und Kleinschreibung nicht berücksicht wird. Das ist hier eigentlich überflüssig.
Das ist eigentlich ein harmloser Ausdruck, aber man muß das üben.
\w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich), wieder beliebig viele, aber mindestens eins. Da der Ausdruck geklammert ist, kriegt der Fund intern die 2.
Der Rest läuft dann genauso.
i ist noch ein Modifizierer, der dafür sorgt, daß Groß- und Kleinschreibung nicht berücksicht wird. Das ist hier eigentlich überflüssig.
Das ist eigentlich ein harmloser Ausdruck, aber man muß das üben.
Hallo,
Ich habe jetzt verstanden, was Du erklärt hast.
. habe ich erst als beliebig betrachtet , und nicht als Punkt.
ok nun jetzt wie geht es weiter ؟
\w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich).
ist w+ jetzt April 200(weil es noch ein d+ =3 ), April 2003, oder April 20 ....
und bei der Ersetzung steht ${2}. Ist sie eigentlich die letzte Zweie Ziffer 0 und 3 .
Gruß
Hello,
Ich habe jetzt verstanden, was Du erklärt hast.
. habe ich erst als beliebig betrachtet , und nicht als Punkt.
ok nun jetzt wie geht es weiter ؟\w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich).
ist w+ jetzt April 200(weil es noch ein d+ =3 ), April 2003, oder April 20 ....
http://www.php.net/manual/de/regexp.reference.php
\w+ ist ein Wortzeichen, also alle Zeichen, die zu Worten gehören. Das Leerzeichen hinter April gehört schon nicht nehr dazu, weil Leerzeichen Worte brechen.
und bei der Ersetzung steht ${2}. Ist sie eigentlich die letzte Zweie Ziffer 0 und 3 .
Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll, die aber sich nicht von '$21' unterscheiden würde. Die '1,' sind dann nur ganz normale Zeichen. Sie sind nicht in der Liste der Sonderbedeutungen enthalten. '$3' ist dann wieder ganz klar als Referenz erkennbar.
Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Lieber Tom,
Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)
LOL - Das ist wohl wahr!
Liebe Grüße,
Felix Riesterer.
\w+ ist ein Wortzeichen, also alle Zeichen, die zu Worten gehören. Das Leerzeichen hinter April gehört schon nicht nehr dazu, weil Leerzeichen Worte brechen.
und bei der Ersetzung steht ${2}. Ist sie eigentlich die letzte Zweie Ziffer 0 und 3 .
Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll, die aber sich nicht von '$21' unterscheiden würde. Die '1,' sind dann nur ganz normale Zeichen. Sie sind nicht in der Liste der Sonderbedeutungen enthalten. '$3' ist dann wieder ganz klar als Referenz erkennbar.
Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)
Liebe Grüße aus Syburg bei Dortmund
<?php
$zeichenkette = '15. April 2003';
$suchmuster = '/(\d+). (\w+) (\d+)/i';
$ersetzung = '${2}1,$3';
echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>
Also zusammenfassung :
(\d+) = 15 : Referenz 1
. = . : keine Referenz, weil keine runde Klammer gibt
(\w+) = April : Referenz 2
(\d+) = 2003 : Referenz 3
$ersetzung = April1,2003
Wunderbar :). Vielen Dank für die Info,
Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll.
Das war hier verwirrend. weil die Geschweifte bedeuten für mich eine Anzahl von einem vorkommenden Zeichen oder Buchstabe. und nicht als ein Referenz. Danke für die Erklärung.
Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)
hier hast Du vollkommen recht :)
Grüße aus Frankfurt
Hello,
Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll.
Das war hier verwirrend. weil die Geschweifte bedeuten für mich eine Anzahl von einem vorkommenden Zeichen oder Buchstabe. und nicht als ein Referenz. Danke für die Erklärung.
Das ist auch verwirrend. Wenn da nun '${3}' stehen würde im Pattern, dann wüsste ich auch nicht, ob nun das Dollarzeichen dreimal als Zeichen vorkommen muss. Kann es im Moment auch nicht ausprobieren.
Logisch wäre es allerdings, da hier ja nicht das $-Steuerzeichen, sondern das $-Schriftzeichen gemeint ist.
Es gibt aber noch die alternative Schreibweise \1 anstelle von $1
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Es gibt aber noch die alternative Schreibweise \1 anstelle von $1
huch.
In Perl ist \1 aber etwas anderes als S1.
m/(hallo).*?\1/
findet hallo unter der Voraussetzung, dass es später nochmals vorkommt.
m/(\w+?)\1/
matcht bubu nana hihi blabla
mfg Beat
Hello,
Es gibt aber noch die alternative Schreibweise \1 anstelle von $1
huch.
In Perl ist \1 aber etwas anderes als S1.m/(hallo).*?\1/
findet hallo unter der Voraussetzung, dass es später nochmals vorkommt.m/(\w+?)\1/
matcht bubu nana hihi blabla
Da das Postinmg auf "PHP" steht, habe ich mich auch daran gehalten :-)
http://www.php.net/manual/de/regexp.reference.php
dort ab Abschnitt "\ddd" kurz beschrieben.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Es gibt aber noch die alternative Schreibweise \1 anstelle von $1
huch.
In Perl ist \1 aber etwas anderes als S1.m/(hallo).*?\1/
findet hallo unter der Voraussetzung, dass es später nochmals vorkommt.m/(\w+?)\1/
matcht bubu nana hihi blabla
Da das Postinmg auf "PHP" steht, habe ich mich auch daran gehalten :-)
http://www.php.net/manual/de/regexp.reference.php
dort ab Abschnitt "\ddd" kurz beschrieben.
Nur ist \1 auch in PHP keine Alternative zu $1, sondern \1 steht unter der Voraussetzung als Backreferenz zur Verfügung, dass eine capturing Klammer vorher verwendet wurde.
Ich sehe in der Problemstellung des OP nicht, wo diese Backreferenzen sinnvoll eingesetzt werden können.
Wiederum ist der Einsatz von $1 zu beachten.
$1 findet Anwendung im Ersetzungsteil, nicht im Suchteil.
Eine Backreferenz aber wird im Suchteil verwendet. Denn die Backreferenz bezieht sich auf Klammern, nicht auf die Variable $1 welche diese Klammer darstellt.
mfg Beat
Hello,
Nur ist \1 auch in PHP keine Alternative zu $1, sondern \1 steht unter der Voraussetzung als Backreferenz zur Verfügung, dass eine capturing Klammer vorher verwendet wurde.
Verstehe ich jetzt nicht, wie Du das meinst.
siehe: http://www.php.net/manual/de/function.preg-replace.php
Ersatz darf Referenzen in der Form \n oder (ab PHP 4.0.4) $n enthalten,
wobei Letztere vorzuziehen ist. Jede dieser Referenzen wird mit dem Text
ersetzt, der vom n-ten eingeklammerten Suchmuster erfasst wurde. n kann
einen Wert von 0 bis 99 haben. \0 oder $0 beziehen sich auf den Text,
der auf das komplette Suchmuster passt. Um die Nummer des erfassenden
Teil-Suchmusters zu erhalten, werden öffnende Klammern mit 1 beginnend
von links nach rechts gezählt.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Nur ist \1 auch in PHP keine Alternative zu $1, sondern \1 steht unter der Voraussetzung als Backreferenz zur Verfügung, dass eine capturing Klammer vorher verwendet wurde.
Verstehe ich jetzt nicht, wie Du das meinst.
siehe: http://www.php.net/manual/de/function.preg-replace.phpErsatz darf Referenzen in der Form \n oder (ab PHP 4.0.4) $n enthalten,
wobei Letztere vorzuziehen ist. Jede dieser Referenzen wird mit dem Text
ersetzt, der vom n-ten eingeklammerten Suchmuster erfasst wurde. n kann
einen Wert von 0 bis 99 haben. \0 oder $0 beziehen sich auf den Text,
der auf das komplette Suchmuster passt. Um die Nummer des erfassenden
Teil-Suchmusters zu erhalten, werden öffnende Klammern mit 1 beginnend
von links nach rechts gezählt.
OK. das war im anderen referenzierten Teil nicht zu lesen.
Zusammenfassung.
Beispiel: Vermeide Buchstabenverdoppelungen
perl:
for($var){
s/(\w)\1/$1/; # OK
s/(\w)\1/\1/; # WRONG
s/(\w)$1/$1/; # WRONG
}
PHP
preg_replace("/(\w)\1/",'$1', $out); // OK
preg_replace("/(\w)\1/",'\1', $out); // OK
preg_replace("/(\w)$1/",'$1', $out); // WRONG ???
mfg Beat
Hallo,
Ich will Reguläre Ausdrücke verwenden, aber die kann ich nicht leicht verstehen. Und zwar z.b folgendes
<?php
$zeichenkette = '15. April 2003';
$suchmuster = '/(\d+). (\w+) (\d+)/i';
$ersetzung = '${2}1,$3';
echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
April1,2003Wie ich verstanden habe:
Suchmuster besteht aus drei Teilen
(\d+) : also 15
(\w+) : April 200
Nein. \w+ matcht nur April, weil Whitespace kein \w Zeichen sondern ein \W Zeichen ist.
(\d+) : 3
Nein, 2003
dann Bei der Ersetzung
${2} was bedeutet das? für mich wäre 03 die letzte zwei Ziffern
${2} ist $2, Es handelt sich um eine Hilfsangabe.
angenommen du hast.
"hier steht ein$valuevon 100"
Dann weiss der kompiler nicht, ob nun $value oder $valuevon vorliegt
"hier steht ein${value}von 100"
macht es klar, dass wir über $value sprechen.
und dann 1,
und dann $3 bedeutet letzte Referenzierung d.h (\d+) = 3
zusammen kommt für mich 031,3
bestimmte irre ich mich, könnte bitte jemand mir das erklären.
in folge des obigen Fehlers ja.
mfg Beat