Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4950 > unrolled thread
| Started by | Detlef Paschke <schabau@t-online.de> |
|---|---|
| First post | 2024-11-04 18:23 +0100 |
| Last post | 2024-11-08 17:29 +0100 |
| Articles | 11 — 3 participants |
Back to article view | Back to de.comp.lang.php
Ist hier noch jemand? str_replace multiple replacement Detlef Paschke <schabau@t-online.de> - 2024-11-04 18:23 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2024-11-04 22:56 +0000
Re: Ist hier noch jemand? str_replace multiple replacement Detlef Paschke <schabau@t-online.de> - 2024-11-05 10:03 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2024-11-05 09:59 +0000
Re: Ist hier noch jemand? str_replace multiple replacement Detlef Paschke <schabau@t-online.de> - 2024-11-05 12:38 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Detlef Paschke <schabau@t-online.de> - 2024-11-05 12:55 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2024-11-05 12:19 +0000
Re: Ist hier noch jemand? str_replace multiple replacement Detlef Paschke <schabau@t-online.de> - 2024-11-05 15:27 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Arno Welzel <usenet@arnowelzel.de> - 2024-11-07 17:31 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Detlef Paschke <schabau@t-online.de> - 2024-11-08 11:25 +0100
Re: Ist hier noch jemand? str_replace multiple replacement Arno Welzel <usenet@arnowelzel.de> - 2024-11-08 17:29 +0100
| From | Detlef Paschke <schabau@t-online.de> |
|---|---|
| Date | 2024-11-04 18:23 +0100 |
| Subject | Ist hier noch jemand? str_replace multiple replacement |
| Message-ID | <vgavv1$5s7v$1@solani.org> |
Hallo an alle,
ist sehr ruhig geworden. Ich hoffe mal, dass hier noch jemand ließt.
Ich habe in einem Script eine Zeile, die zwei mal str_replace ausführt,
weil ich zu dumm bin, das in einem mal hinzubekommen.
str_replace(['../', './'], '', str_replace('\\', '/', $datei));
Mit preg_replace geht es so, wie ich es mir vorstelle, doch so kann ich
es kaum noch lesen.
preg_replace(['/(\.\/|\.\.\/)/', '/(\\\\)/'], ['', '/'], $datei);
Ich bekomme ein ODER im Suchausdruck mit str_replace einfach nicht hin
oder zumindest nicht so, dass ein Array im Ersetzen-Teil dann noch
zuverlässig funktioniert.
So funktioniert es zwar, aber schön ist das auch nicht.
str_replace(['./', '../', '\\'], ['','','/'], $datei)
Ist noch einer von den Profis hier, die genau wissen, wo wieder mal eine
Klammer fehlt oder das Hochkomma falsch ist?
Viele Grüße
Detlef Paschke
--
Das "Zitat des Augenblick" gibt es nur auf:
https://schabau.eu
Meine "Merkzettel" findet man unter:
https://helpdesk.schabau.eu
[toc] | [next] | [standalone]
| From | Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) |
|---|---|
| Date | 2024-11-04 22:56 +0000 |
| Message-ID | <1t67294ef1i26d911n3e8%sfroehli@Froehlich.Priv.at> |
| In reply to | #4950 |
On Mon, 04 Nov 2024 18:23:47 Detlef Paschke wrote:
> [Funktioniert, braucht aber 2 Aufrufe]
> str_replace(['../', './'], '', str_replace('\\', '/', $datei));
> [Funktioniert nicht]
> str_replace(['./', '../', '\\'], ['','','/'], $datei)
Mich würde ja interessieren, wie Du vom einen zum anderen Ausdruck
gekommen bist - unmittelbar einsichtig ist das nämlich nicht :-)
An sich wären die beiden Schreibweisen (nahezu) ident: Wenn Du ein
Array übergibst, werden die Elemente einfach der Reihe nach
durchiteriert. Die "funktionierende" Variante sollte also kaum
teurer sein.
Aber natürlich geht es auch in der eleganteren Version, Du musst nur
aus hoffentlich naheliegenden Gründen sicherstellen, dass ../ *vor
./ ersetzt wird.
> Mit preg_replace geht es so, wie ich es mir vorstelle, doch so
> kann ich es kaum noch lesen.
> preg_replace(['/(\.\/|\.\.\/)/', '/(\\\\)/'], ['', '/'], $datei);
Hier funktioniert es unabhängig von der Reihenfolge, da reguläre
Ausdrücke immer den längsten Match suchen. Die Auswahl zwischen .
und .. ließe sich allerdings auch einfacher treffen, die Klammern um
das Pattern sind unnötig, und für den Delimiter empfiehlt sich in
diesem Fall ein anderes Zeichen. Ich würde etwas lesbarer schreiben:
preg_replace(['#\.\.?/#', '#\\\\#'], ['', '/'], $datei);
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike
Stefan - Wahnsinn, der begeistert!
(Sloganizer)
[toc] | [prev] | [next] | [standalone]
| From | Detlef Paschke <schabau@t-online.de> |
|---|---|
| Date | 2024-11-05 10:03 +0100 |
| Message-ID | <vgcn02$6n4u$1@solani.org> |
| In reply to | #4951 |
Am 04.11.2024 um 23:56 schrieb Stefan Froehlich:
> On Mon, 04 Nov 2024 18:23:47 Detlef Paschke wrote:
>> [Funktioniert, braucht aber 2 Aufrufe]
>> str_replace(['../', './'], '', str_replace('\\', '/', $datei));
>
>> [Funktioniert nicht]
>> str_replace(['./', '../', '\\'], ['','','/'], $datei)
>
> ...
>
> Aber natürlich geht es auch in der eleganteren Version, Du musst nur
> aus hoffentlich naheliegenden Gründen sicherstellen, dass ../ *vor
> ./ ersetzt wird.
Stimmt danke, im eigentlichen Script ist es auch richtig herum, in der
"Test.php" habe ich es korrigiert. Da war mir der Fehler noch gar nicht
aufgefallen.
>> Mit preg_replace geht es so, wie ich es mir vorstelle, doch so
>> kann ich es kaum noch lesen.
>
>> preg_replace(['/(\.\/|\.\.\/)/', '/(\\\\)/'], ['', '/'], $datei);
>
> Hier funktioniert es unabhängig von der Reihenfolge, da reguläre
> Ausdrücke immer den längsten Match suchen. Die Auswahl zwischen .
> und .. ließe sich allerdings auch einfacher treffen, die Klammern um
> das Pattern sind unnötig, und für den Delimiter empfiehlt sich in
> diesem Fall ein anderes Zeichen. Ich würde etwas lesbarer schreiben:
>
> preg_replace(['#\.\.?/#', '#\\\\#'], ['', '/'], $datei);
Mein Beweggrund ist, was bis jetzt nur mit diesen blöden regulären
Ausdrücke und preg_replace funktioniert, mit str_replace hinzubekommen.
Es funktioniert ja auch ganz schick mit den preg_replace Varianten, aber
es ist so fürchterlich zu lesen für mich.
Ganz primitiv übersetzt:
Array1('../' ODER './', '\'), Array2('', '/')
Und genau diesen ODER Teil, dass ../ ODER ./ zu '' wird, also gelöscht
werden sollen, bekomme ich mit str_replace nicht hin. Und das in so
einem hübschen kleinen Einzeiler. :-)
> Servus,
> Stefan
Viele Grüße
Detlef Paschke
--
Das "Zitat des Augenblick" gibt es nur auf:
https://schabau.eu
Meine "Merkzettel" findet man unter:
https://helpdesk.schabau.eu
[toc] | [prev] | [next] | [standalone]
| From | Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) |
|---|---|
| Date | 2024-11-05 09:59 +0000 |
| Message-ID | <3t6729ebcfi28f81an3e8%sfroehli@Froehlich.Priv.at> |
| In reply to | #4952 |
On Tue, 05 Nov 2024 10:03:00 Detlef Paschke wrote:
> Am 04.11.2024 um 23:56 schrieb Stefan Froehlich:
>>> preg_replace(['/(\.\/|\.\.\/)/', '/(\\\\)/'], ['', '/'], $datei);
>> Hier funktioniert es unabhängig von der Reihenfolge, da reguläre
>> Ausdrücke immer den längsten Match suchen. Die Auswahl zwischen .
>> und .. ließe sich allerdings auch einfacher treffen, die Klammern um
>> das Pattern sind unnötig, und für den Delimiter empfiehlt sich in
>> diesem Fall ein anderes Zeichen. Ich würde etwas lesbarer schreiben:
>> preg_replace(['#\.\.?/#', '#\\\\#'], ['', '/'], $datei);
> Mein Beweggrund ist, was bis jetzt nur mit diesen blöden regulären
> Ausdrücke und preg_replace funktioniert, mit str_replace
> hinzubekommen.
Es dürfte durchaus sinnvoll sein, reguläre Ausdrücke nur dort zu
verwenden, wo sie auch erforderlich sind. Trotzdem schadet es nicht,
sie lesbar zu formulieren :)
> Ganz primitiv übersetzt:
> Array1('../' ODER './', '\'), Array2('', '/')
> Und genau diesen ODER Teil, dass ../ ODER ./ zu '' wird, also
> gelöscht werden sollen, bekomme ich mit str_replace nicht hin. Und
> das in so einem hübschen kleinen Einzeiler. :-)
Wieso? Inzwischen sollte das ja klappen.
Du musst Dir halt vergegenwärtigen, dass Deine Oder-Verknüpfung
einen logischen Fehler enthält: Jeder String, der '../' enthält,
enthält automatisch auch './', und sobald Du letzteres durch den
Leerstring ersetzt, bleibt Dir ein unerwünschter Punkt übrig.
Löse Dich von der Oder-Verknüpfung und ersetze gedanklich einen
Teilstring nach dem anderen, immer mit dem längsten beginnend.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike
Stefan - die vollkommenste Nuance von selig!
(Sloganizer)
[toc] | [prev] | [next] | [standalone]
| From | Detlef Paschke <schabau@t-online.de> |
|---|---|
| Date | 2024-11-05 12:38 +0100 |
| Message-ID | <vgd03m$ghr6$1@solani.org> |
| In reply to | #4953 |
Am 05.11.2024 um 10:59 schrieb Stefan Froehlich:
> On Tue, 05 Nov 2024 10:03:00 Detlef Paschke wrote:
>> Am 04.11.2024 um 23:56 schrieb Stefan Froehlich:
>> Ganz primitiv übersetzt:
>
>> Array1('../' ODER './', '\'), Array2('', '/')
>
>> Und genau diesen ODER Teil, dass ../ ODER ./ zu '' wird, also
>> gelöscht werden sollen, bekomme ich mit str_replace nicht hin. Und
>> das in so einem hübschen kleinen Einzeiler. :-)
>
> Wieso? Inzwischen sollte das ja klappen.
In keiner Weise. Mit preg_replace funktioniert es wie ich es mir
vorstelle, ist aber schwerer zu lesen. Mit str_replace geht es nur
nacheinander oder wenn das replace Arrays und das search Array die selbe
Anzahl an Werten haben.
$datei = './folder\file.txt ODER ../folder\file.txt';
echo '<p>str_replace (./folder\file.txt ODER ../folder\file.txt)</p>';
var_dump(str_replace(['../', './'], '', str_replace('\\', '/', $datei)));
Die ursprüngliche, derzeit verwendete und funktionierende Variante. Die
wollte ich gern in ein str_replace "zusammenschieben".
var_dump(str_replace(['../', './', '\\'], ['', '', '/'], $datei));
Die Variante funktioniert, aber es sind im search und replace Array die
selbe Anzahl von Werten. Die Werte '../' und './' haben den gleichen
replace Wert. Ich hätte ja gern, dass sie den selben haben.
echo '<p>str_replace WUNSCH';
var_dump(str_replace([('../' | './'), '\\'], ['', '/'], $datei));
Meine Wunschvorstellung mit ODER Verknüpfung für den ersten Wert im
search Array, die beide auf den ersten Wert des replace Array zutreffen
sollen. Funktioniert nur für den zweiten Teil. Nur \ wird gegen /
ausgetauscht.
echo '<p>preg_replace (./folder\file.txt ODER ../folder\file.txt)</p>';
var_dump(preg_replace(['/(\.\/|\.\.\/)/', '/(\\\\)/'], ['', '/'], $datei));
var_dump(preg_replace(['#\.\.?/#', '#\\\\#'], ['', '/'], $datei));
var_dump(preg_replace(['#\.+/#', '#\\\\#'], ['', '/'], $datei));
Die Varianten mit preg_replace, die alle funktionieren. Meine erste
Variante mit ODER, dein Vorschlag und ein von mir daraufhin
abgeleiteter, der wohl auch bei .....\ greifen würde, was hier aber
keine Rolle spielt.
> Du musst Dir halt vergegenwärtigen, dass Deine Oder-Verknüpfung
> einen logischen Fehler enthält: Jeder String, der '../' enthält,
> enthält automatisch auch './', und sobald Du letzteres durch den
> Leerstring ersetzt, bleibt Dir ein unerwünschter Punkt übrig.
Das ist ja nun behoben und betraf auch nur meine bastel Datei.
> Löse Dich von der Oder-Verknüpfung und ersetze gedanklich einen
> Teilstring nach dem anderen, immer mit dem längsten beginnend.
Ganz gebe ich noch nicht auf, manchmal muss man nur das richtige
Suchwort bei google haben und findet was man schon ewig sucht. :-)
> Servus,
> Stefan
>
Viele Grüße
Detlef Paschke
--
Das "Zitat des Augenblick" gibt es nur auf:
https://schabau.eu
Meine "Merkzettel" findet man unter:
https://helpdesk.schabau.eu
[toc] | [prev] | [next] | [standalone]
| From | Detlef Paschke <schabau@t-online.de> |
|---|---|
| Date | 2024-11-05 12:55 +0100 |
| Message-ID | <vgd12u$ghr7$1@solani.org> |
| In reply to | #4954 |
Am 05.11.2024 um 12:38 schrieb Detlef Paschke: > > $datei = './folder\file.txt ODER ../folder\file.txt'; > > ... > > echo '<p>preg_replace (./folder\file.txt ODER ../folder\file.txt)</p>'; > ... > var_dump(preg_replace(['#\.+/#', '#\\\\#'], ['', '/'], $datei)); Und für den \ reicht für meinen Zweck wohl auch '#\\\#' mit nur drei \. Das ist dieser Nerv mit den regulären Ausdrücken und dem ewigen escapen. Viele Grüße Detlef Paschke -- Das "Zitat des Augenblick" gibt es nur auf: https://schabau.eu Meine "Merkzettel" findet man unter: https://helpdesk.schabau.eu
[toc] | [prev] | [next] | [standalone]
| From | Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) |
|---|---|
| Date | 2024-11-05 12:19 +0000 |
| Message-ID | <1t672a0c08i2973ddn3e8%sfroehli@Froehlich.Priv.at> |
| In reply to | #4954 |
On Tue, 05 Nov 2024 12:38:32 Detlef Paschke wrote:
> Am 05.11.2024 um 10:59 schrieb Stefan Froehlich:
>> On Tue, 05 Nov 2024 10:03:00 Detlef Paschke wrote:
>>> Am 04.11.2024 um 23:56 schrieb Stefan Froehlich:
>>> Array1('../' ODER './', '\'), Array2('', '/')
>>> Und genau diesen ODER Teil, dass ../ ODER ./ zu '' wird, also
>>> gelöscht werden sollen, bekomme ich mit str_replace nicht hin.
>>> Und das in so einem hübschen kleinen Einzeiler. :-)
>> Wieso? Inzwischen sollte das ja klappen.
> In keiner Weise. Mit preg_replace funktioniert es wie ich es mir
> vorstelle, ist aber schwerer zu lesen. Mit str_replace geht es nur
> nacheinander oder wenn das replace Arrays und das search Array die
> selbe Anzahl an Werten haben.
> $datei = './folder\file.txt ODER ../folder\file.txt';
> echo '<p>str_replace (./folder\file.txt ODER ../folder\file.txt)</p>';
> var_dump(str_replace(['../', './'], '', str_replace('\\', '/', $datei)));
> Die ursprüngliche, derzeit verwendete und funktionierende Variante. Die
> wollte ich gern in ein str_replace "zusammenschieben".
> var_dump(str_replace(['../', './', '\\'], ['', '', '/'], $datei));
Eben, passt. Fertig und aus :)
> Die Werte '../' und './' haben den gleichen replace Wert. Ich
> hätte ja gern, dass sie den selben haben.
> echo '<p>str_replace WUNSCH';
> var_dump(str_replace([('../' | './'), '\\'], ['', '/'], $datei));
Sorry, wenn ich Deinen WUNSCH zerstöre, aber wie sollte das denn
funktionieren? Einmal abseits der PHP-Spezifikation, rein
wunschtheoretisch: ('../' | './') ist wahlweise Unfung, weil sich
Strings nicht verodern lassen, oder Unfung, weil das Ergebnis der
(egal ob typkonvertierten oder bitweisen) Veroderung nicht das ist,
was Du gerne hättest. Jedenfalls aber kannst Du nicht einer
Funktion, die als Argument einen String erwartet (und sei es in der
Komponente eines Arrays) statt dessen eine Liste von Strings (oder
einen arithmetischen Ausdruck) geben, in der Hoffnung, dass daraus
auf magische Weise das richtige entsteht.
Entweder Du machst ein 1:1 Mapping von search und replace (was ich
hier bevorzugen würde), oder Du nimmst eben einen regulären
Ausdruck, in dem Alternativen per Definition enthalten sind. Dann
landest Du halt wieder bei preg_replace().
>> Löse Dich von der Oder-Verknüpfung und ersetze gedanklich einen
>> Teilstring nach dem anderen, immer mit dem längsten beginnend.
> Ganz gebe ich noch nicht auf, manchmal muss man nur das richtige
> Suchwort bei google haben und findet was man schon ewig sucht. :-)
Nicht, wenn bereits die Grundidee einen Logikfehler enthält.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike
Stefan - Eine Klasse für sich.
(Sloganizer)
[toc] | [prev] | [next] | [standalone]
| From | Detlef Paschke <schabau@t-online.de> |
|---|---|
| Date | 2024-11-05 15:27 +0100 |
| Message-ID | <vgd9vv$ghr6$2@solani.org> |
| In reply to | #4956 |
Am 05.11.2024 um 13:19 schrieb Stefan Froehlich: > > Entweder Du machst ein 1:1 Mapping von search und replace (was ich > hier bevorzugen würde), oder Du nimmst eben einen regulären > Ausdruck, in dem Alternativen per Definition enthalten sind. Dann > landest Du halt wieder bei preg_replace(). Ich habe so meine Probleme mit regulären Ausdrücken (da werde ich sicher nicht der einzige sein) und dann insbesondere damit, wie preg_replace() damit umgeht. Ich habe es ja z.B. so Begriffen, dass mit \ das nachverfolgende Zeichen gequotet wird. Ich muss also \\ eingeben, um ein \ zu bekommen. Bei str_replace() ist das auch so und bei allen möglichen anderen Zeichen klappt das auch mit preg_replace() so. Wieso brauche ich bei preg_replace() aber \\\ um ein \ zu bekommen??? Das ist für mich einfach unbegreiflich. Die beiden Varianten sind gerade in meiner näheren Auswahl und noch halbwegs lesbar. var_dump(preg_replace(['/(\.+\/)/', '/(\\\)/'], ['', '/'], $datei)); var_dump(preg_replace(['#\.+/#', '#\\\#'], ['', '/'], $datei)); Was sagen die Rauten aus deinem Beispiel gegenüber der runden Klammern eigentlich genau aus? Ich kann nichts zu den Rauten finden und sonst wird nur die Variante mit den runden Klammern gezeigt. Meine erste Anlaufstelle ist eigentlich immer php.net und da finde ich gar keine Variante mit Rauten. > Servus, > Stefan > Viele Grüße Detlef Paschke -- Das "Zitat des Augenblick" gibt es nur auf: https://schabau.eu Meine "Merkzettel" findet man unter: https://helpdesk.schabau.eu
[toc] | [prev] | [next] | [standalone]
| From | Arno Welzel <usenet@arnowelzel.de> |
|---|---|
| Date | 2024-11-07 17:31 +0100 |
| Message-ID | <lp48b3FdaejU1@mid.individual.net> |
| In reply to | #4950 |
Detlef Paschke, 2024-11-04 18:23: [...] > So funktioniert es zwar, aber schön ist das auch nicht. > > str_replace(['./', '../', '\\'], ['','','/'], $datei) Was ist daran "nicht schön?". -- Arno Welzel https://arnowelzel.de
[toc] | [prev] | [next] | [standalone]
| From | Detlef Paschke <schabau@t-online.de> |
|---|---|
| Date | 2024-11-08 11:25 +0100 |
| Message-ID | <vgkov9$l2e0$1@solani.org> |
| In reply to | #4958 |
Am 07.11.2024 um 17:31 schrieb Arno Welzel: > Detlef Paschke, 2024-11-04 18:23: > > > [...] >> So funktioniert es zwar, aber schön ist das auch nicht. >> >> str_replace(['./', '../', '\\'], ['','','/'], $datei) > > Was ist daran "nicht schön?". Schöner fände ich das Ersetzungs-Array so, ['','/'] wie es bei preg_replace in allen Varianten geht. In einer Variante eben auch mit logischen ODER Operator, ['/(\.\/|\.\.\/)/', '/(\\\\)/'] und ich hoffte, dass sich das auf str_replace übertragen lässt. Dem ist aber wohl nicht so. Viele Grüße Detlef Paschke -- Das "Zitat des Augenblick" gibt es nur auf: https://schabau.eu Meine "Merkzettel" findet man unter: https://helpdesk.schabau.eu
[toc] | [prev] | [next] | [standalone]
| From | Arno Welzel <usenet@arnowelzel.de> |
|---|---|
| Date | 2024-11-08 17:29 +0100 |
| Message-ID | <lp6sinFpfr7U1@mid.individual.net> |
| In reply to | #4959 |
Detlef Paschke, 2024-11-08 11:25: > Am 07.11.2024 um 17:31 schrieb Arno Welzel: >> Detlef Paschke, 2024-11-04 18:23: >> >> >> [...] >>> So funktioniert es zwar, aber schön ist das auch nicht. >>> >>> str_replace(['./', '../', '\\'], ['','','/'], $datei) >> >> Was ist daran "nicht schön?". > > Schöner fände ich das Ersetzungs-Array so, ['','/'] wie es bei > preg_replace in allen Varianten geht. In einer Variante eben auch mit Nein, preg_replace() arbeitet auch nicht so. Zitat aus <https://www.php.net/manual/en/function.preg-replace.php>: If there are fewer elements in the replacement array than in the pattern array, any extra patterns will be replaced by an empty string. (Zitat Ende) Das wäre dann für ['', '/'] als replacement: './' --> ''; '../' --> '/'; '\\' --> ''; Denn ab dem 3. Suchmuster wird nur '' als Ersetzung verwendet. > logischen ODER Operator, ['/(\.\/|\.\.\/)/', '/(\\\\)/'] und ich hoffte, > dass sich das auf str_replace übertragen lässt. Dem ist aber wohl nicht so. Nein, genau deswegen gibt es ja preg_replace(), weil das "oder" halt ein Teil des regulären Ausdrucks wäre. -- Arno Welzel https://arnowelzel.de
[toc] | [prev] | [standalone]
Back to top | Article view | de.comp.lang.php
csiph-web