![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Hi, ich werd noch wahnsinnig. Sorry für den bescheuerten Titel. Ich habe folgendes Pattern: Code: ([a-zA-Z-]+)\/{0,1}([a-zA-Z-]+)\/([\d]+),([\w-]+)
Code: kategorie/1,das-ist-ein-titel rubrik-demo/sektion/4312,toller-titel Code: array(5) {
[0]=>
array(1) {
[0]=>
string(37) "rubrik-demo/sektion/4312,toller-titel"
}
[1]=>
array(1) {
[0]=>
string(11) "rubrik-demo"
}
[2]=>
array(1) {
[0]=>
string(7) "sektion"
}
[3]=>
array(1) {
[0]=>
string(4) "4312"
}
[4]=>
array(1) {
[0]=>
string(12) "toller-titel"
}
}
Wenn ich es auf den ersten String anwende erhalte ich das hier Code: array(5) {
[0]=>
array(1) {
[0]=>
string(29) "kategorie/1,das-ist-ein-titel"
}
[1]=>
array(1) {
[0]=>
string(8) "kategori"
}
[2]=>
array(1) {
[0]=>
string(1) "e"
}
[3]=>
array(1) {
[0]=>
string(1) "1"
}
[4]=>
array(1) {
[0]=>
string(17) "das-ist-ein-titel"
}
}
Ich bin der absolute Laie was reguläre Ausdrücke angeht, aber man muss ja auch mal was neues lernen, gell? Das Pattern mal auseinandergenommen, so wie ich das verstehe:
Hm, kann mir wer sagen, wieso da das letzte Zeichen separat ausgelesen wird? Danke. Grüße, Ben. [EDIT] Getestet natürlich mit dem regex-tester(.de) |
| | |
| | Nach oben #2 |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
|
Soweit ich das um 7:30 Uhr sehe, ist die zweite Zeile vom Aufbau her, genau wie die erste Zeile, nur mit einen Zusätzlichen Wert davor. So auf die Schnelle: http://www.regex-tester.de/regex_20061106072945.html bzw.: Code: (?:([\w\-]+)/)?([\w\-]+)/(\d+),([\w\-]+) Den Modifer i hab ich versehend mit eingebaut, was bei \w nicht benötigt wird. Bei deiner zweiten Zeile steht noch zusätzlich rubrik-demo/ da. Damit dies, sagen wir mal optinal ist, dient dieser Bereich: Code: (?:([\w\-]+)/)? Ich weis nicht wie weitere solcher Zeilen von dir aussehen, aber es könnte passieren du musst dies wieder rausnehmen, wenn du gezielt auf das Array-Ergebnis zugreiffen willst. Das abschliessende ? hinter ( ... ) bedeutet nur, dass dieser String vorkommen kann, aber nicht muss. Noch etwas: Code: [\w\-] Muss nicht unbedingt sein, sollte man sich aber angewöhnen. Das Minuszeichen steht eigentlich für einen Bereich von-bis. Also a-z => von a bis z Folgender Ausdruck würde sonst nicht gehen: [a-cm-] Willst du dein Pattern etwas eingrenzen: Code: (?:([a-z\-]+)/)?([a-z\-]+)/([0-9]+),([a-z\-]+) So Kaffee trinken ... |
| | |
| | Nach oben #3 |
| Johannes Schlichenmaier Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 398
|
Wofür dient genau das ?: ? Also, wieso benötigt man es? Ich habe mal ein wenig rumprobiert und bin auf die selbe Antwort auf die Frage, aber auf diese Lösung gekommen: Code: ([a-zA-Z-]+\/)?([a-zA-Z-]+)\/([\d]+)\,([\w-]+) Danke im vorraus für die Erklärung Jojo
__________________ In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
| | |
| | Nach oben #4 | |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Hi. Es wurden ja bereits Lösungen genannt, allerdings scheint mir der Part nach dem ersten optionalen Slash (hier: /section) optional zu sein und nicht der Part davor. Daher würde ich eben auch diesen als optional definieren und nicht den Part vor dem Slash, wie in den hier gezeigten Lösungen. Von vorne: Zitat:
Im ersten String den du testest gibt es diesen Slash nicht. Bleiben also zwei Blöcke mit je 1-n Buchtaben übrig. Um dieses Suchmuster für "kategorie" zu erfüllen wird dieser String nun also zerlegt in zwei Blöcke, die die Muster erfüllen. Das könnte letztlich alles zwischen k-ategorie und kategori-e sein und preg_match nimmt eben letztere Möglichkeit. Um das zu verhindern musst du einfach den Teil "Optionaler Slash gefolg von 1-n Buchstaben" als Option angeben: Code: ([a-zA-Z-]+)(?:/{0,1}([a-zA-Z-]+)?)/([\d]+),([\w-]+)
Basti Geändert von Basti (06.11.2006 um 12:33 Uhr). | |
| | |
| | Nach oben #6 | |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Wow. Danke. Gute Antworten sind das. Habe CIXs Pattern verwendet, aber ich hätte - nach meinem Verständnis - auch Bastis nehmen können. Klappen beide wunderbar. Danke für die Erläuterungen. Hier das verstehe ich aber noch nicht ganz Zitat:
Danke. Grüße, Ben. | |
| | |
| | Nach oben #7 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Das "+" steht für mindestens 1 mal. Zu den Unterschieden der beiden Varianten nochmal: PHP-Code: Code: (?:([a-z\-]+)/)?([a-z\-]+)/([0-9]+),([a-z\-]+:(
array
0 => 'kategorie/1,das-ist-ein-titel' (length=29)
1 => '' (length=0)
2 => 'kategorie' (length=9)
3 => '1' (length=1)
4 => 'das-ist-ein-titel' (length=17)
array
0 => 'rubrik-demo/sektion/4312,toller-titel' (length=37)
1 => 'rubrik-demo' (length=11)
2 => 'sektion' (length=7)
3 => '4312' (length=4)
4 => 'toller-titel' (length=12)
([a-z\-]+)(?:/{0,1}([a-z\-]+)?)/([\d]+),([a-z\-]+:(
array
0 => 'kategorie/1,das-ist-ein-titel' (length=29)
1 => 'kategorie' (length=9)
2 => '' (length=0)
3 => '1' (length=1)
4 => 'das-ist-ein-titel' (length=17)
array
0 => 'rubrik-demo/sektion/4312,toller-titel' (length=37)
1 => 'rubrik-demo' (length=11)
2 => 'sektion' (length=7)
3 => '4312' (length=4)
4 => 'toller-titel' (length=12)
Basti |
| | |
| | Nach oben #8 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
| Oh Gott. Ich hab n-1 gelesen und 1-n geschrieben. Jau. Danke. Danke auch für die Zusammenstellung der beiden Varianten. Merke: Ich sollte mich intensiver damit beschäftigen. Klingt alles ganz interessant. Grüße, Ben. |
| | |
| | Nach oben #9 | ||
| Johannes Schlichenmaier Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 398
| Zitat:
das hab ich gebraucht
__________________ In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int | ||
| | |
| | Nach oben #10 |
| Erfahrener Benutzer Registriert seit: 18.03.2005
Beiträge: 591
|
Nunja, das ganze mit ?: hat erst Sinn, wenn Gruppierungen (runde Klammern) vorhanden sind. Beispiel: Code: (B[a-z]+) Code: (?:B[a-z]+) ?: bezieht sich immer auf eine Gruppierung (runde Klammern). Diese Zeile ist demnach falsch. Code: ?:B[a-z]+ |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Notepad++]UTF-8 setzt Zeichen an Dateianfang | WarrenFaith | Tools, Server, Betriebssysteme | 2 | 21.01.2007 18:02 |