|
|
w3news


: 10.10.2006 : 939 : Berlin
|
| : 09.02.2010, 17:27 : str_replace nur einmal ausführen |
|
|
Hallo,
vielleicht stehe ich ja auf der Leitung, aber kann mir jemand einen Tipp geben wie ich einen String in einem Text ersetzen kann, dies aber nur einmal?
Also ich habe einen Text:
| : |
| Dies ist ein Test. Den Test sollte man immer machen. |
Jetzt soll das Wort Test ersetzt werden, aber allerdings nur einmal, wenn es geht das letzte Test, dass erste wäre aber auch in Ordnung.
Danke für jeden Tipp.
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 09.02.2010, 17:42 : str_replace nur einmal ausführen |
|
|
So, habs mal mit der preg_replace probiert geht aber auch nicht so wirklich:
| Code: |
$limit=1;
$count=1;
$url=preg_replace('Test', 'Test2', $url, $limit, $count); |
Fehlermeldung:
| : |
| Delimiter must not be alphanumeric or backslash... |
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
Synonym

: 09.08.2008 : 3354 : Würzburg
|
| : 09.02.2010, 17:44 : str_replace nur einmal ausführen |
|
|
Hm, nur mal so in den Raum geworfen
Ich würde mit strrpos die letzte Position der gesuchten Zeichenkette suchen und denn mit substr_replace ab der Position ersetzen.
Gibt aber sicherlich auch andere Wege |
|
| Nach oben |
|
 |
ishmael

: 18.04.2009 : 102
|
| : 09.02.2010, 17:47 : str_replace nur einmal ausführen |
|
|
Die Funktion preg_replace() hat einen $limit Parameter. Um den letzen Wert zu ersetzen könnte man den String und den regulären Ausdruck mit strrev() umdrehen und anschließend wieder zurückdrehen.
Edit: preg_replace arbeitet mit pear regular expressions
Das Pattern sähe z.B. so aus:
Mein Blog
Zuletzt bearbeitet von ishmael am 09.02.2010, 17:51, insgesamt einmal bearbeitet |
|
| Nach oben |
|
 |
Synonym

: 09.08.2008 : 3354 : Würzburg
|
| : 09.02.2010, 17:50 : str_replace nur einmal ausführen |
|
|
Nachtrag:
Bei Deinem Code oben ist das "$count=1; " der Fehler. Über "$count" liefert die Funktion die Anzahl der ersetzen Stellen zurück, da darfst Du selbst keinen Wert vorgeben. |
|
| Nach oben |
|
 |
ishmael

: 18.04.2009 : 102
|
| : 09.02.2010, 17:53 : str_replace nur einmal ausführen |
|
|
Die Fehlermeldung bezieht sich auf den fehlerhaften regulären Ausdruck. Siehe Edit in meinem Post.
Unabhängig davon ist die Idee mit strpos() und substr_replace wohl am effektivsten.
Mein Blog |
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 09.02.2010, 18:10 : str_replace nur einmal ausführen |
|
|
Danke schon mal, klappt auch, aber nicht ganz:
| : |
$url="Dies ist ein Test. Den Test sollte man immer machen.";
$suchmuster="Test";
$limit=strrpos($url,$suchmuster);
$ersetzung="Test2";
$url=substr_replace($suchmuster, $ersetzung, $url, $limit);
echo "$url";
|
Jetzt kommt beim echo nur "Test2" raus, nicht aber der Rest vom Text.
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 09.02.2010, 18:32 : str_replace nur einmal ausführen |
|
|
Hast Du Dir die Doku von substr_replace überhaupt angesehen?
So müsste es gehen (nicht getestet):
| Code: |
$url="Dies ist ein Test. Den Test sollte man immer machen.";
$suchmuster="Test";
$start = strpos($url, $suchmuster);
$length = strlen($suchmuster);
$ersetzung="Test2";
$url=substr_replace($url, $ersetzung, $start, $length);
echo "$url";
|
|
|
| Nach oben |
|
 |
w3news


: 10.10.2006 : 939 : Berlin
|
| : 09.02.2010, 18:43 : str_replace nur einmal ausführen |
|
|
Gelesen schon, aber das habe ich doch glatt ignoriert, danke euch jetzt funktioniert es so wie es gewünscht ist!
MfG Lars
News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates |
|
| Nach oben |
|
 |
mgutt


: 08.03.2005 : 3135
|
| : 10.02.2010, 03:06 : str_replace nur einmal ausführen |
|
|
preg_replace() dürfte in dem Fall genauso schnell sein
| Code: |
| $url = preg_replace('/Test/', 'Test2', $url, 1); |
Wenn nicht sogar schneller, wenn man die ganzen Vars so sieht, die hier unnötigerweise gesetzt werden 
» Adsense & Vibrant Alternative
» Ankauf von Communities und Forendomains |
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 10.02.2010, 10:50 : str_replace nur einmal ausführen |
|
|
Hey Marc, guter Einwand! Ich hatte eigentlich nur den Code korrigiert, ohne überhaupt auf Performance zu achten. Trotzdem hatte mein Bauchgefühl mir gesagt, dass performance-mäßig fast alles besser als preg_replace() ist.
| mgutt hat Folgendes geschrieben: |
| $url = preg_replace('/Test/', 'Test2', $url, 1); |
Du darfst natürlich keine Variablen entfernen, die tatsächlich gebraucht werden. Die preg_replace() wird ja kaum mit Konstanten gefüttert. Der wesentliche Unterschied beider Varianten besteht also nicht in der Anzahl der Variablen, sondern in der Anzahl der Aufrufe (bzw. in der Komplexität des Codes dahinter).
Aus Interesse habe ich mal die Probe gemacht. Es tritt als Solist das Universalgenie preg_replace() gegen das Spezialisten-Trio strpos(), strlen(), substr_replace() an. Beide Teams dürfen 10.000.000x zeigen, wer schneller ist.
| Code: |
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$url="Dies ist ein Test. Den Test sollte man immer machen.";
$suchmuster = "Test";
$ersetzung = "Test2";
$i=0;
$preg_start = microtime_float();
{
// *** PREG_REPLACE ***
for($i; $i<10000000; $i++) {
$preg_result = preg_replace("/{$suchmuster}/", $ersetzung, $url, 1);
}
}
$preg_end = microtime_float();
$i=0;
$substr_start = microtime_float();
{
// *** SUBSTR_REPLACE ***
for($i; $i<10000000; $i++) {
$start = strpos($url, $suchmuster);
$length = strlen($suchmuster);
$substr_result = substr_replace($url, $ersetzung, $start, $length);
}
}
$substr_end = microtime_float();
echo "PREG: {$preg_result} (".round($preg_end - $preg_start, 2)."s)<br>";
echo "SUBSTR: {$substr_result} (".round($substr_end - $substr_start, 2)."s)<br>";
|
Ausgabe:
PREG: Dies ist ein Test2. Den Test sollte man immer machen. (17.82s)
SUBSTR: Dies ist ein Test2. Den Test sollte man immer machen. (11.43s)
Fazit:
Die PREG-Variante ist gut 50 Prozent langsamer! |
|
| Nach oben |
|
 |
Synonym

: 09.08.2008 : 3354 : Würzburg
|
| : 10.02.2010, 10:53 : str_replace nur einmal ausführen |
|
|
Und wenn man nun nicht immer strpos(), sondern das anfangs geschriebene strrpos() verwendet, dann hat man auch den letzten Wert als Ersatz, so wie es eigentlich gewünscht war. Das preg_replace kann nämlich auch nur am Anfang beginnen.  |
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 10.02.2010, 11:07 : str_replace nur einmal ausführen |
|
|
| Synonym hat Folgendes geschrieben: |
Und wenn man nun nicht immer strpos(), sondern das anfangs geschriebene strrpos() verwendet, dann hat man auch den letzten Wert als Ersatz, so wie es eigentlich gewünscht war. Das preg_replace kann nämlich auch nur am Anfang beginnen.  |
Na und? Dann macht man es so:
| Code: |
| $preg_result = preg_replace("/(.*){$suchmuster}/", "\$1$ersetzung", $url, 1); |
Der obige Code (mit einigen Anpassungen) ergibt dann nach nur 1.000.000 Durchläufen pro Verfahren:
PREG: Dies ist ein Test. Den Test sollte man immer machen. Denn ohne Test2 geht es nicht. (7.31s)
SUBSTR: Dies ist ein Test. Den Test sollte man immer machen. Denn ohne Test2 geht es nicht. (1.39s)
In diesem Fall ist preg_replace() um ca. Faktor 5 langsamer. |
|
| Nach oben |
|
 |
Synonym

: 09.08.2008 : 3354 : Würzburg
|
| : 10.02.2010, 11:29 : str_replace nur einmal ausführen |
|
|
In welcher Beziehung stehen die beiden Aussagen
"Na und? Dann macht man es so: "
und
"In diesem Fall ist preg_replace() um ca. Faktor 5 langsamer."
Eben deshalb hatte ich ja kein preg_replace genommen.  |
|
| Nach oben |
|
 |
SloMo

: 04.01.2005 : 4027
|
| : 10.02.2010, 11:35 : str_replace nur einmal ausführen |
|
|
Ist doch überhaupt nicht schlimm, dass Du dachtest, dass preg_replace() nicht das letzte Vorkommen ersetzen kann.  |
|
| Nach oben |
|
 |