preg_replace ersetzt nur einmal

preg_replace ersetzt nur einmal

am 27.07.2006 12:33:02 von Marco Wittwer

Hallo

Ich habe ein Problem mit einem Regulären Ausdruck. Ich will
/data/File/t1.xml in allen href's ersetzen. Folgender Code macht dies leider
nur im ersten Vorkommen und nicht in allen.

$i = 0;
$body = 'bla bla bla bla href="/data/File/t1.xml">bla bla';
$body = preg_replace('/( href=")(..\\/|\\/)(data\\/File\\/.+)(")/','$1index.php?file= $3$4',$body,-1,$i);
echo $i.'
';
echo htmlspecialchars($body);

Was mache ich falsch?
Danke, Gruss wima

Re: preg_replace ersetzt nur einmal

am 27.07.2006 15:22:02 von Niels Braczek

Marco Wittwer schrieb:

> Ich habe ein Problem mit einem Regulären Ausdruck. Ich will=20
> /data/File/t1.xml in allen href's ersetzen. Folgender Code macht dies l=
eider=20
> nur im ersten Vorkommen und nicht in allen.

Das sieht sicher nur so aus. Das Muster passt dann nämlich auch nur
einmal -- sonst würde öfter ersetzt.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: preg_replace ersetzt nur einmal

am 28.07.2006 07:59:46 von Marco Wittwer

> Das sieht sicher nur so aus. Das Muster passt dann nämlich auch nur
> einmal -- sonst würde öfter ersetzt.
>

Ja genau, das hier ist die richtige Regex:
$body = preg_replace('/(
href=")(..\\/|\\/)(data\\/File\\/[^"]*)/','$1index.php?file= $3',$body);

Gruss wima

Re: preg_replace ersetzt nur einmal

am 28.07.2006 17:50:51 von Alex Hepp

Marco Wittwer schrieb:
>> Das sieht sicher nur so aus. Das Muster passt dann nämlich auch nur
>> einmal -- sonst würde öfter ersetzt.
>>
>
> Ja genau, das hier ist die richtige Regex:
> $body = preg_replace('/(
> href=")(..\\/|\\/)(data\\/File\\/[^"]*)/','$1index.php?file= $3',$body);
>
> Gruss wima

hi!

also nur mal so interessehalber:

warum (..\\/|\\/)

1. ist der '.' eine wildcard, die imho escaped werden müsste...
ansonsten matcht er doch 2 beliebige chars an dieser position.

2. warum soll der / escaped werden? und warum mit 2 \? imho "erkennt"
dieser ausdruck folgendes: entweder zwei beliebige zeichen gefolgt von
'\/' oder nur '\/'.

will niemanden berichtigen, sondern wissen, warum das so ist!

lg. alex

Re: preg_replace ersetzt nur einmal

am 28.07.2006 18:01:50 von Frank Schenk

Alex Hepp wrote:
> Marco Wittwer schrieb:
>> $body = preg_replace('/(
>> href=")(..\\/|\\/)(data\\/File\\/[^"]*)/','$1index.php?file= $3',$body);

> also nur mal so interessehalber:
>
> warum (..\\/|\\/)
>
> 1. ist der '.' eine wildcard, die imho escaped werden müsste...
> ansonsten matcht er doch 2 beliebige chars an dieser position.

genau

> 2. warum soll der / escaped werden? und warum mit 2 \? imho "erkennt"
> dieser ausdruck folgendes: entweder zwei beliebige zeichen gefolgt von
> '\/' oder nur '\/'.

weil '/' als pattern delimiter verwendet wurde muss er escaped werden.
Ich nehme als Delimiter immer ein Zeichen, daß ich garantiert nicht für
den Ausdruck brauche - z.B. "~" oder "#"

Und zweimal escapen macht so keinen Sinn, er escaped das escapezeichen,
der slash wird dann als delimiter erkannt und php wirft ne warning die
er nicht mitbekommt, da error_reporting auf off steht o. dgl.

> will niemanden berichtigen, sondern wissen, warum das so ist!

Ist nicht so, der regex ist einfach nur kaputt :)

Frank

Re: preg_replace ersetzt nur einmal

am 02.08.2006 09:46:19 von Marco Wittwer

>> also nur mal so interessehalber:
>>
>> warum (..\\/|\\/)
>>
>> 1. ist der '.' eine wildcard, die imho escaped werden müsste... ansonsten
>> matcht er doch 2 beliebige chars an dieser position.
>
> genau

ich will eigentlich ../ oder / matchen. Ja, dazu muss ich den . Backslashen.

>
>> 2. warum soll der / escaped werden? und warum mit 2 \? imho "erkennt"
>> dieser ausdruck folgendes: entweder zwei beliebige zeichen gefolgt von
>> '\/' oder nur '\/'.
>
> weil '/' als pattern delimiter verwendet wurde muss er escaped werden. Ich
> nehme als Delimiter immer ein Zeichen, daß ich garantiert nicht für den
> Ausdruck brauche - z.B. "~" oder "#"

Danke für den Tip, wenn ich als Delemiter nicht / verwende, wird der
Ausdruck einfacher.

> Ist nicht so, der regex ist einfach nur kaputt :)

Stimmt nicht ganz, denn funktioniert hat es.
Nun sieht mein Ausdruck so aus:
~(

Gruss wima

Re: preg_replace ersetzt nur einmal

am 02.08.2006 23:45:58 von Norbert Melzer

Am Wed, 2 Aug 2006 09:46:19 +0200 schrieb Marco Wittwer:

> Stimmt nicht ganz, denn funktioniert hat es.
> Nun sieht mein Ausdruck so aus:
> ~(
^^^^^^^^^
Und jetzt? Schau doch mal genau hin, er testet jetzt nämlich so:

\\ -> Ein Backslash
.. -> Ein beliebiges Zeichen
\\ -> Ein Backslash
.. -> Ein beliebiges Zeichen
/ -> Ein Slash
| -> ODER
/ -> Ein Slash

Warum verpackst Du das nicht in:

~(

> Gruss wima

HTH
Norbert

Re: preg_replace ersetzt nur einmal

am 14.08.2006 10:57:07 von Alex Hepp

Norbert Melzer schrieb:
> Am Wed, 2 Aug 2006 09:46:19 +0200 schrieb Marco Wittwer:
>
>> Stimmt nicht ganz, denn funktioniert hat es.

Das wundert mich ehrlich gesagt, ein bisschen!

>> Nun sieht mein Ausdruck so aus:
>> ~(
> ^^^^^^^^^
> Und jetzt? Schau doch mal genau hin, er testet jetzt nämlich so:
>
> ~(

So gefällt mir das auch schon vieeeel besser ;)

lg. Alex