Regulärer Ausdruck: Nur letztes Element matchen
Regulärer Ausdruck: Nur letztes Element matchen
am 02.05.2007 14:52:36 von Bastian Neugarten
Hallo,
ich habe folgendes Problem. Ich möchte in einem Text das letzte
Vorkommen ersetzen.
BSP - das Letzte "der" soll ersetzt werden.
Text:
das ist der text
das ist der text
PHP:
$text = "das ist der text\n das ist der text";
$regex = '/der$/is';
$replace = 'ERSETZT';
echo preg_replace($regex, $replace, $text);
$regex = '/der$/is';
// Hier ersetzt er nichts, da noch Text folgt.
$regex = '/der(.*?)$/is';
// Hier ist die regex gierig und ersetzt schon beim ersten vorkommen, da
ja alles gemachted wird.
Frage:
Wie ersetze ich das letzte Vorkommen von "der" in dem Text?
Re: Regulärer Ausdruck: Nur letztes Element matchen
am 03.05.2007 16:39:23 von Mirco Wahab
Bastian Neugarten wrote:
> Hallo,
>
> ich habe folgendes Problem. Ich möchte in einem Text das letzte
> Vorkommen ersetzen.
>
> BSP - das Letzte "der" soll ersetzt werden.
> Text:
> das ist der text
> das ist der text
>
> Wie ersetze ich das letzte Vorkommen von "der" in dem Text?
>
> $text = "das ist der text\n das ist der text";
> $regex = '/der$/is';
> $replace = 'ERSETZT';
> echo preg_replace($regex, $replace, $text);
>
$regex = '/der(?!.*der)/s';
u.U. musst Du Backtracking kreativ einsetzen, ;-)
z.B.:
$text = '
das ist der text
das ist der text
und mehr text
';
$regex = '/(.*)der(.*)$/s';
$replace = 'ERSETZT';
echo preg_replace($regex, '\1'.$replace.'\2', $text);
?>
Viele Grüße
M.
Re: Regulärer Ausdruck: Nur letztes Element matchen
am 03.05.2007 16:45:27 von Gregor Kofler
Bastian Neugarten meinte:
> $regex = '/der(.*?)$/is';
> // Hier ist die regex gierig und ersetzt schon beim ersten vorkommen, da
> ja alles gemachted wird.
Nein hier ist der Ausdruck ungreedy, aber es gibt ja keine Angabe einer
definitiven Zeichenkette bis zu der er ungreedy sein kann.
/der(?!.*der)/
dürfte funktionieren, aber es geht sicher eleganter.
Gregor
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Re: RegulärerAusdruck: Nur letztes Element matchen
am 04.05.2007 09:18:21 von Matthias Esken
On Thu, 03 May 2007 16:39:23 +0200, Mirco Wahab wrote:
> Bastian Neugarten wrote:
>
>> Wie ersetze ich das letzte Vorkommen von "der" in dem Text?
>
> $regex = '/(.*)der(.*)$/s';
> $replace = 'ERSETZT';
> echo preg_replace($regex, '\1'.$replace.'\2', $text);
Minimal schneller:
$regex = '/(.*)(der)/s';
$replace = 'ERSETZT';
echo preg_replace($regex, '$1' . $replace, $text);
Gruß,
Matthias
Re: Regulärer Ausdruck: Nur letztes Element matchen
am 07.05.2007 18:39:00 von Bastian Neugarten
Gregor Kofler schrieb:
> Bastian Neugarten meinte:
>
>> $regex = '/der(.*?)$/is';
>> // Hier ist die regex gierig und ersetzt schon beim ersten vorkommen,
>> da ja alles gemachted wird.
>
> Nein hier ist der Ausdruck ungreedy, aber es gibt ja keine Angabe einer
> definitiven Zeichenkette bis zu der er ungreedy sein kann.
>
> /der(?!.*der)/
>
> dürfte funktionieren, aber es geht sicher eleganter.
>
> Gregor
>
>
Danke Gregor,
genau was ich gesucht habe.
Re: Regulärer Ausdruck: Nur letztes Element matchen
am 07.05.2007 18:40:20 von Bastian Neugarten
Mirco Wahab schrieb:
> Bastian Neugarten wrote:
>> Hallo,
>>
>> ich habe folgendes Problem. Ich möchte in einem Text das letzte
>> Vorkommen ersetzen.
>>
>> BSP - das Letzte "der" soll ersetzt werden.
>> Text:
>> das ist der text
>> das ist der text
>>
>> Wie ersetze ich das letzte Vorkommen von "der" in dem Text?
>>
>> $text = "das ist der text\n das ist der text";
>> $regex = '/der$/is';
>> $replace = 'ERSETZT';
>> echo preg_replace($regex, $replace, $text);
>>
>
> $regex = '/der(?!.*der)/s';
>
>
> u.U. musst Du Backtracking kreativ einsetzen, ;-)
> z.B.:
>
> $text = '
> das ist der text
> das ist der text
> und mehr text
> ';
>
> $regex = '/(.*)der(.*)$/s';
> $replace = 'ERSETZT';
> echo preg_replace($regex, '\1'.$replace.'\2', $text);
>
> ?>
>
>
> Viele Grüße
>
> M.
Danke, funktioniert. :)