PHP Frage zu preg_match

Bububoomt

ohne Vertrauen
ID: 10361
L
28 April 2006
19.666
769
Ich habe folgenden Codeschnippsel:

Code:
$pattern ='/{text}(.*?){\/text}/';
preg_match($pattern,$sHelp,$text);

dieser funktioniert aber nicht immer, scheinbar klappt der irgendwieso nciht wenn der inhalt von $sHelp wie folgt aussieht:
HTML:
<p>{text}</p>
<p>irgendwas</p>
<p>{/text}</p>

nur wenn es so ist:

HTML:
{text}
<p>irgendwas</p>
{/text}

oder so:
HTML:
<p>{text}irgendwas{/text}</p>


kann gerade nicht verstehen wieso das erste nicht auch klappt, müsste doch auch klappen oder?
Wäre super wenn dass auch klappt, natürlich am besten wenn dann </p> am Anfang wegfällt und am ende das <p>

Wo liegt der Fehler das es gar nicht klappt und das Array leer ist?
 
Auf das "warum" habe ich auch keine Antwort.
Doch mit
PHP:
$sHelp=str_replace(chr(10),"",$sHelp);
wird das Array wieder gefüllt.

Getestet mit:
PHP:
$pattern ='/{text}(.*?){\/text}/';
//$sHelp="<p>{text}</p><p>was</p><p>{/text}</p>";
$sHelp="
<p>{text}</p>
<p>was</p>
<p>{/text}</p>
";
$sHelp=str_replace(chr(10),"",$sHelp);
$text=array();

$a=preg_match($pattern,$sHelp,$text);
print_r($text);
erzeugt die Ausgabe:
Code:
Array ( [0] => {text}

was

{/text} [1] =>

was

)

Es gibt noch einen Modifizierer "m" (PCRE_MULTILINE) mit dem man was mit Zeilenumbrüchen machen kann: https://www.php.net/manual/de/reference.pcre.pattern.modifiers.php
vielleicht kannst das ja einbauen.


edit:
Die Ausgabe sieht so aus (Quelltext):
Code:
Array
(
    [0] => {text}</p>
<p>was</p>
<p>{/text}
    [1] => </p>
<p>was</p>
<p>
)
 
nur wenn es so ist:

HTML:
{text}
<p>irgendwas</p>
{/text}

(...)

Das kann eigentlich auch nicht funktionieren. Sicher, dass das beim Test nicht doch nur in einer Zeile stand?

Hintergrund ist der, dass der . (Punkt) normalerweise nicht für Zeilenumbrüche gilt. Also findet preg_match, wenn {text} und {/text} nicht in einer Zeile stehen, keinen Treffer.

Das kannst du mit dem Modifikator s (PCRE_DOTALL) ändern. Dann gilt der . (Punkt) auch für Zeilenumbrüche.


Also häng an dein Pattern mal noch den s-Modifikator und es müsste klappen.

PHP:
$pattern ='/{text}(.*?){\/text}/s';

Quelle: https://www.php.net/manual/de/reference.pcre.pattern.modifiers.php




Edit:

Dann noch was anderes. Was soll denn (.*?) sein? (.*) wäre meiner Meinung nach korrekt. Das ? dürfte nach einem * rein gar nichts bewirken.
 
habe das mit den zeilenumbruch auch inzwischen bemerkt, war halt reiner zufall, das bei dem einen immer umbrüche vorhanden waren und sonst halt nicht.

hatte erstmal mit str_replace alle entfernt, aber das mit dem Paramter s ist wohl sinniger.

@wahnsinn
(.*?) findet man irgendwie überall auch auf deiner Verlinkten Seite.
Mit regex stehe ich so auf dem Kriegsfuss, habs halt wo übernommen...