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. :)