preg_match_all - Fehler in Expression (PHP)?!
Mr.Luke
- php
0 Cheatah0 Mr.Luke0 Voodoo
0 seth_not@home
0 MudGuard
Mahlzeit!
Ich brauche eure Hilfe, da meine "preg_match_all" Funktion nicht so will... wie ich will :]
Hier der Code...
preg_match_all("#{if[start]}(.*?){if[ende]#", $String, $Array);
Der Sinn...
Ich möchte eine Art Abfrage in einem Template erstellen, welche dann denn Inhalt zwischen "{if[start]}" und "{if[ende]}" sucht?!
Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [], aber auch wenn ich diese mit \ maskiere dann funktioniert es nicht :(
Bitte um Hilfe?!
Gruß,
Mr. Luke
Hi,
Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [],
exakt.
aber auch wenn ich diese mit \ maskiere dann funktioniert es nicht :(
Du bringst Zeichen wie "[" oder "{" in einen RegExp-Kontext, musst sie also RegExp-spezifisch kodieren. Das hast Du fast vollständig durchgeführt. Anschließend bringst Du diese RegExp in den String-Kontext, musst sie also String-spezifisch kodieren. Und in Zukunft vergiss bitte nicht die Fehlerbeschreibung - "funktioniert nicht" war noch nie eine und wird auch niemals eine sein.
Cheatah
Danke!
Die korrigierte Fehlerbeschreibung: Maskierung in Regulär Expressions fehlerhaft. :)
Leider hat die Maskierung nicht funktioniert, d.h. ich erhalte immer ein leeres Array.
Hier die korrigierte Funktion ....
preg_match_all("#{if[start]}(.*?){if[ende]}#", $String, $Array);
Hier ein Ausschnitt aus dem HTML Template ...
{if[start]}
<tr>
<td class="title">{object_area_lbl}</td>
<td class="text">{object_area_val}</td>
</tr>
{if[ende]}
Kann es damit zusammenhängen, dass im (.*?) Teil auch noch weitere Platzhalter existieren? Diese werden mit einem einfachen str_replace() mit Informationen ersetzt.
Gruß,
Mr. Luke
Hi,
Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [],
exakt.
aber auch wenn ich diese mit \ maskiere dann funktioniert es nicht :(
Du bringst Zeichen wie "[" oder "{" in einen RegExp-Kontext, musst sie also RegExp-spezifisch kodieren. Das hast Du fast vollständig durchgeführt. Anschließend bringst Du diese RegExp in den String-Kontext, musst sie also String-spezifisch kodieren. Und in Zukunft vergiss bitte nicht die Fehlerbeschreibung - "funktioniert nicht" war noch nie eine und wird auch niemals eine sein.
Cheatah
Manchmal ist es einfacher als man denkt.
Zu . gehört standardmäßig nicht der Zeilenumbruch.
Einfach den Modifier s hinzuüfgen. So werden auch Zeilenumbrüche als . erkannt.
preg_match_all("#{if[start]}(.*?){if[ende]}#s", $String, $Array);
Grüße aus dem Wald
Voodoo
Manchmal hilf auch einfach etwas "Voodoo" :)
Vielen Dank... es funktioniert und ich bin jetzt ne Lachnummer im Team - Gott bin ich blöde!!!
Gruß,
Mr. Luke
Manchmal ist es einfacher als man denkt.
Zu . gehört standardmäßig nicht der Zeilenumbruch.
Einfach den Modifier s hinzuüfgen. So werden auch Zeilenumbrüche als . erkannt.preg_match_all("#{if[start]}(.*?){if[ende]}#s", $String, $Array);
Grüße aus dem Wald
Voodoo
@@Mr.Luke:
Vielen Dank... es funktioniert und ich bin jetzt ne Lachnummer im Team - Gott bin ich blöde!!!
Lektüre von http://de.wikipedia.org/wiki/TOFU macht dich schlauer. ;-)
Live long and prosper,
Gunnar
gudn tach!
Leider klappt das bei dieser Expression icht. Ich denke es liegt an den Sonderzeichen {} oder [],
exakt.
noe, es lag nur am fehlenden 's', das maskieren war nicht falsch; siehe https://forum.selfhtml.org/?t=165361&m=1078247.
Du bringst Zeichen wie "[" oder "{" in einen RegExp-Kontext, musst sie also RegExp-spezifisch kodieren. Das hast Du fast vollständig durchgeführt. Anschließend bringst Du diese RegExp in den String-Kontext, musst sie also String-spezifisch kodieren.
grundsaetzlich stimmt das zwar, hat aber nix mit dem OP-problem zu tun.
ich sag's bloss fuer's archiv.
prost
seth
Hi,
Hier der Code...
preg_match_all("#{if[start]}(.*?){if[ende]#", $String, $Array);
nach { muß die Anzahl der gewünschten Vorkommen stehen, also #{1} für genau eins, #{,7} für maximal 7, #{2,4} für 2 bis 4 #-Zeichen.
Wenn Du ein explizites { suchen willst, mußt Du es wie die [] escapen.
cu,
Andreas
gudn tach!
Hier der Code...
preg_match_all("#{if[start]}(.*?){if[ende]#", $String, $Array);nach { muß die Anzahl der gewünschten Vorkommen stehen, also #{1} für genau eins, #{,7} für maximal 7, #{2,4} für 2 bis 4 #-Zeichen.
nein.
1. # ist hier delimiter
2. php denkt hier mit und versteht die braces hier literal.
zu 2.: ich weiss allerdings nicht, ob dies vor php 5.2 auch schon so war.
Wenn Du ein explizites { suchen willst, mußt Du es wie die [] escapen.
noe, muss man nicht. und man muss noch nicht mal immer die brackets escapen.
der regexp '#{if[start]}(.*?){if[ende]}#s'
macht das gleiche wie '/{if[start]}(.*?){if[ende]}/s'
prost
seth