Ich denke, Sie haben mehr Probleme als nur den Punkt Zeilenumbrüche nicht übereinstimmen, aber lassen Sie mich mit einer Formatierungsempfehlung beginnen. Sie können fast jedes Interpunktionszeichen als Regex-Begrenzer verwenden, nicht nur den Schrägstrich ('/'). Wenn Sie ein anderes Zeichen verwenden, müssen Sie keine Schrägstriche innerhalb der Regex entziffern. Ich verstehe "%" ist beliebt bei PHPers; das würde Ihr Muster Argument machen:
'%\{a\}([.\n]+)\{/a\}%'
Nun, der Grund, dass regex nicht funktioniert, wie Sie ist beabsichtigt, da der Punkt seine besondere Bedeutung verliert, wenn es innerhalb einer Zeichenklasse (die eckigen Klammern) erscheint - so [.\n]
entspricht nur einem Punkt oder einem Zeilenvorschub. Was Du gesucht war (?:.|\n)
, aber ich würde den Wagenrücklauf sowie den Zeilenvorschub empfohlen passend:
'%\{a\}((?:.|[\r\n])+)\{/a\}%'
Das ist, weil das Wort „Newline“ auf den Unix-Stil beziehen kann „\ n“, Windows-Stil "\ r \ n" oder älter-Mac-Stil "\ r". Jede gegebene Webseite kann irgendwelche von diesen oder eine Mischung von zwei oder mehr Arten enthalten; eine Mischung aus "\ n" und "\ r \ n" ist sehr verbreitet. Aber mit/s-Modus (auch als einzeilige oder DOTALL Modus bekannt), brauchen Sie nicht zu befürchten, dass:
'%\{a\}(.+)\{/a\}%s'
Allerdings gibt es ein anderes Problem mit dem ursprünglichen Regex, die in diesem noch vorhanden ist: die +
ist gierig. Das bedeutet, wenn es mehr als eine {a}...{/a}
Sequenz im Text gibt, wird die Regex das erste Mal angewendet, wenn sie alle übereinstimmt, von der ersten {a}
bis zur letzten {/a}
. Der einfachste Weg, dies zu beheben, ist den +
ungreedy (auch bekannt als „faul“ oder „nur ungern“) zu machen, indem ein Fragezeichen angehängt:
'%\{a\}(.+?)\{/a\}%s'
Schließlich, ich weiß nicht, was den ‚$ machen 'vor dem Eröffnungszitat Ihres Musterarguments. Ich mache kein PHP, aber das sieht für mich wie ein Syntaxfehler aus. Wenn mich jemand in dieser Angelegenheit unterrichten könnte, würde ich es begrüßen.
Awesome, ich wusste, es wäre so einfach! – DisgruntledGoat
Auch ich habe gerade festgestellt, dass diese Info auf der PHP-Website ist, obwohl ich noch nie zuvor bei der Suche gefunden habe ... http://www.php.net/manual/en/reference.pcre.pattern.modifiers .php – DisgruntledGoat