Regulärer Ausdruck
Christophe
- php
1 Der Martin
0 Christophe0 Der Martin
1 ChrisB
0 Tom
Hallo zusammen
Habe eine Frage zu einem Regulären ausdruck. Nichts verrücktes aber ich komme nicht drauf. Ich will lediglich das nur Zeichenketten mit diesem Format akzeptiert werden. "string1\string2:" was ich bis jetzt gemacht habe
if (preg_match('/^[A-Z].[\].[a-zA-Z:]/', trim($read))){
[...]
}
Habe schon etliche Versionen aber es passt nicht wirklich. Ich hoffe es kann mir wer helfen.
Danke
Hallo,
Ich will lediglich das nur Zeichenketten mit diesem Format akzeptiert werden. "string1\string2:"
dein RegEx meint aber etwas ganz anderes. Nämlich:
^ Stringanfang
[A-Z] EIN Großbuchstabe
. EIN beliebiges Zeichen
[].[a-zA-Z:] EIN Zeichen, das entweder Buchstabe, eckige Klammer,
Punkt oder Doppelpunkt ist
Habe schon etliche Versionen aber es passt nicht wirklich. Ich hoffe es kann mir wer helfen.
Aus welchen Zeichen dürfen denn string1 und string2 bestehen? Nur Buchstaben? Ich nehme mal an, Großbuchstaben, Kleinbuchstaben und Ziffern. Also haben wir folgenden Ausdruck:
^ Stringanfang
[0-9A-Za-z] Ziffer, Großbuchstabe oder Kleinbuchstabe, und das
+ beliebig oft, aber mindestens 1mal
\ Ein Backslash
[0-9A-Za-z] Ziffer, Großbuchstabe oder Kleinbuchstabe, und das
+ beliebig oft, aber mindestens 1mal
: Ein Doppelpunkt
Ganz wichtig:
1. Der Punkt steht für EIN beliebiges Zeichen.
2. Zeichen + und * stehen als Quantifizierer. Ein * hinter einem Zeichen oder einer Zeichenklasse bedeutet: beliebig oft, darf aber auch fehlen; ein + bedeutet: beliebig oft, aber mindestens 1mal.
3. Wenn Sonderzeichen als normale Zeichen des Ausdrucks gemeint sind, muss ihnen ein Backslash als Escape-Zeichen vorangestellt werden.
4. Daraus folgt, dass der Backslash selbst auch eine Sonderbedeutung hat und ebenfalls escapet werden muss, wenn er wörtlich gemeint ist.
Durch die fehlerhafte Verwendung des Backslash hast du z.B. die schließende eckige Klammer "unwirksam gemacht". Was du mit dem Punkt vorhattest, kann ich mir allerdings nicht erklären.
So long,
Martin
Erst mal danke für dein ausführliche Antwort. Habe das nun nach deinem Rezept eingebaut aber ich komme trotztdem nicht in die if Bedingung. Habe jetzt geschrieben:
$read = "TEST\gaga:";
if (preg_match('/^[A-Z]+\\[a-z]+:/', trim($read))){
echo $read;
}
Dies sollte doch eigentlich funktionieren? Was mache ich den noch immer falsch?
Hallo Christophe,
$read = "TEST\gaga:";
if (preg_match('/[1]+\[a-z]+:/', trim($read))){
echo $read;
}
>
> Dies sollte doch eigentlich funktionieren? Was mache ich den noch immer falsch?
Der Fehler liegt in deinem Test-String:
$read = "TEST\gaga:";
Der String enthält offensichtlich keinen Backslash, sondern die Escape-Sequenz \g, die aber nicht speziell definiert ist. Ich weiß nicht, wie PHP solche undefinierten Escapes auflöst, aber lass dir den String mal direkt ausgeben - ich vermute, er lautet "TESTgaga" oder "TESTaga".
Beachte den Unterschied zwischen 'einzelnen' und "doppelten" Anführungszeichen! Wenn du den String in '' setzt, wird das Ergebnis das sein, was du erwartest, denn dann werden keine Escape-Sequenzen aufgelöst. Andernfalls musst du den Backslash auch hier mit einem Backslash escapen, also doppelt notieren, um \*einen\* Backslash im String zu haben.
Ciao,
Martin
--
Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Beim Universum bin ich mir aber nicht ganz sicher.
(Albert Einstein, deutscher Physiker)
A-Z ↩︎
Hi,
Wenn du den String in '' setzt, wird das Ergebnis das sein, was du erwartest, denn dann werden keine Escape-Sequenzen aufgelöst.
<klugscheiss> Doch, und zwar ' und \ </klugscheiss>
MfG ChrisB
Hallo Chris,
Wenn du den String in '' setzt, wird das Ergebnis das sein, was du erwartest, denn dann werden keine Escape-Sequenzen aufgelöst.
<klugscheiss> Doch, und zwar ' und \ </klugscheiss>
das wusste ich in der Tat noch nicht, danke für den Hinweis!
Nein, nicht <klugscheiss>, sondern wertvolle Info.
Schönes Wochenende,
Martin
Hello,
Erst mal danke für dein ausführliche Antwort. Habe das nun nach deinem Rezept eingebaut aber ich komme trotztdem nicht in die if Bedingung. Habe jetzt geschrieben:
$read = "TEST\gaga:";
if (preg_match('/[1]+\[a-z]+:/', trim($read))){
echo $read;
}
>
> Dies sollte doch eigentlich funktionieren? Was mache ich den noch immer falsch?
Hast Du für $read wirklich 'TEST\gaga:' in Doublequotes benutzt, oder steht da vielleicht etwas anderes in Deinem Testscript?
Der Backslash hat auch bei PHP eine besondere Bedeutung:
<http://www.php.net/manual/de/language.types.string.php#language.types.string.syntax.double>
Wenn Du Deinen Teststring also mittels Doublequotes begrenzt im Script, dann musst Du den Backslash sinnvollerweise auch escapeen. Mit "\g" wird aber PHP nichts anfangen können. Schau Dir aber trotzdem mal an, was dabei herauskommt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
A-Z ↩︎