PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Reguläre Ausdrücke



derflo
14-02-2006, 20:08
Hallo


Ich habe da ein Kleines Problem mit einem Regulären ausdruck.

vorweg, ich bin noch php neuling.

So folgendermaßen sieht die Funktion aus die in einer html Datei nach einem html Kommentar sucht


protected function _initTemplate()
{
preg_match_all("/<!--\s+BEGIN\s+(.*)?\s+-->(.*)<!--\s+END\s*(\\1)\s+-->/ms",$this->t,$ma);
for ($i = 0; $i < count($ma[0]); $i++)
{
$search = "/\s*\n*<!--\s+BEGIN\s*(" . $ma[1][$i] . ")?\s*-->(.*)<!--\s*END\s*(" . $ma[1][$i]. ")\s*-->\s*\n*/ms";
$replace = $this->delimiterStart . $ma[1][$i] . $this->delimiterEnd;

$this->bl[$ma[1][$i]] =& new $this->className('',$this->params);
$this->bl[$ma[1][$i]]->loadTemplateContent($ma[2][$i]);
$this->t = preg_replace($search,$replace,$this->t);
}
}


So sieht das html aus


<table>
<tr><th>Arbeitsplatz NR</th><th>Hardwaretauglich für:</th></tr>
<!-- BEGIN hardware -->
<tr><td>{apnr}</td><td>{tauglichkeit}</td></tr>
<!-- END hardware -->
</table>
<p>Folgende weitere Arbeitsplätze stehen nach einem Umbau zur verfügung</p>
<table >

Erst war es so das nach <!-- genau ein Leerzeichen kommen musste bevor man BEGIN schreiben konnte, hinter hardware genau das selbe.

Nun habe ich den Regulären ausdruck so geändert das die Leerzeichen davor keine rolle spielen, sprich es ist egal wie viele man macht.

Allerdings klappt das irgentwie nicht hinter END hardware, es klappt einfach nicht.

Könnt ihr mir helfen?

ClausVB
17-02-2006, 15:43
Richtig helfen kann ich Dir nicht, weil der Programmcode entweder nicht von Dir ist (so etwas schreibt kein Neuling :-) oder ich bin mit 4 Jahren PHP-Erfahrung auch zu doof.

2 Tips:
- andere Template-Klasse (vlibTemplate, Smarty, TinyButStrong (http://lamp.clausvb.de/))
- der das Tool "The Regex Coach" (über Google suchen)
benutzen.

Der Regex Coach hilft beim Abbilden von regulären Ausdrücken enorm. Er wird Dir hier aber nur helfen, wenn Du den PHP-Code hinter der Template-Klasse verstehst. Das weiß ich aus eigener leidvoller Erfahrung, als ich angefangen habe an der Template Engine (http://de.wikipedia.org/wiki/Template_Engine) vom IPB (Forum) "herumzufuschen".

Gruß
Claus

Pingu
17-02-2006, 16:43
Also ich bin auch nicht der Regex-Experte. Ich habe zwar ein dickes Regex-Perl-Buch zu Hause. Aber trotzdem ich es bei mir meistens "probieren geht über studieren".

Du willst doch schon mindestens immer ein "Space" haben?

Wie wäre es mit dieser Variante (vorsicht, ich habe es nicht ausprobiert, nur ein Vorschlag:
protected function _initTemplate()
{
preg_match_all("/<!--\s+BEGIN\s+([^\s]*)?\s+-->(.*)<!--\s+END\s+(\\1)\s+-->/ms",$this->t,$ma);
for ($i = 0; $i < count($ma[0]); $i++)
{
$search = "/\s*\n*<!--\s+BEGIN\s+(" . $ma[1][$i] . ")?\s+-->(.*)<!--\s+END\s+(" . $ma[1][$i]. ")\s+-->\s*\n*/ms";
$replace = $this->delimiterStart . $ma[1][$i] . $this->delimiterEnd;

$this->bl[$ma[1][$i]] =& new $this->className('',$this->params);
$this->bl[$ma[1][$i]]->loadTemplateContent($ma[2][$i]);
$this->t = preg_replace($search,$replace,$this->t);
}
}

Pingu

derflo
18-02-2006, 11:15
Ja ist nicht mein Code

Ich will das es egal ist wieviele Leerzeichen da sind