Suchmaschinenoptimierung
   
 

SEMSEO Konferenz 2012
 

 
 

str_replace nur einmal ausführen

Gehe zu Seite 1, 2, 3  Weiter
Neues Thema eröffnen   Neue Antwort erstellen    ABAKUS Foren-Übersicht -> Webprogrammierung, Templatedesign & Microformats
 Bilder aus Ordner laden Sidebar in anchen Browsern abgeschmiert  
w3news

pr


: 10.10.2006
: 939
: Berlin


: 09.02.2010, 17:27    : str_replace nur einmal ausführen Antworten mit Zitat

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 Private Nachricht senden E-Mail senden
w3news

pr


: 10.10.2006
: 939
: Berlin


: 09.02.2010, 17:42    : str_replace nur einmal ausführen Antworten mit Zitat

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
w3news Private Nachricht senden E-Mail senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 09.02.2010, 17:44    : str_replace nur einmal ausführen Antworten mit Zitat

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
Synonym Private Nachricht senden
ishmael

pr


: 18.04.2009
: 102



: 09.02.2010, 17:47    : str_replace nur einmal ausführen Antworten mit Zitat

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:
Code:
/Test/


Mein Blog


Zuletzt bearbeitet von ishmael am 09.02.2010, 17:51, insgesamt einmal bearbeitet
Nach oben
ishmael Private Nachricht senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 09.02.2010, 17:50    : str_replace nur einmal ausführen Antworten mit Zitat

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
Synonym Private Nachricht senden
ishmael

pr


: 18.04.2009
: 102



: 09.02.2010, 17:53    : str_replace nur einmal ausführen Antworten mit Zitat

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
ishmael Private Nachricht senden
w3news

pr


: 10.10.2006
: 939
: Berlin


: 09.02.2010, 18:10    : str_replace nur einmal ausführen Antworten mit Zitat

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
w3news Private Nachricht senden E-Mail senden
SloMo

pr


: 04.01.2005
: 4027



: 09.02.2010, 18:32    : str_replace nur einmal ausführen Antworten mit Zitat

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
SloMo Private Nachricht senden
w3news

pr


: 10.10.2006
: 939
: Berlin


: 09.02.2010, 18:43    : str_replace nur einmal ausführen Antworten mit Zitat

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
w3news Private Nachricht senden E-Mail senden
mgutt

pr


: 08.03.2005
: 3135



: 10.02.2010, 03:06    : str_replace nur einmal ausführen Antworten mit Zitat

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
mgutt Private Nachricht senden
SloMo

pr


: 04.01.2005
: 4027



: 10.02.2010, 10:50    : str_replace nur einmal ausführen Antworten mit Zitat

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
SloMo Private Nachricht senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 10.02.2010, 10:53    : str_replace nur einmal ausführen Antworten mit Zitat

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
Synonym Private Nachricht senden
SloMo

pr


: 04.01.2005
: 4027



: 10.02.2010, 11:07    : str_replace nur einmal ausführen Antworten mit Zitat

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
SloMo Private Nachricht senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 10.02.2010, 11:29    : str_replace nur einmal ausführen Antworten mit Zitat

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
Synonym Private Nachricht senden
SloMo

pr


: 04.01.2005
: 4027



: 10.02.2010, 11:35    : str_replace nur einmal ausführen Antworten mit Zitat

Ist doch überhaupt nicht schlimm, dass Du dachtest, dass preg_replace() nicht das letzte Vorkommen ersetzen kann.
Nach oben
SloMo Private Nachricht senden
Neues Thema eröffnen   Neue Antwort erstellen    ABAKUS Foren-Übersicht -> Webprogrammierung, Templatedesign & Microformats
Seite 1 von 3
Gehe zu Seite 1, 2, 3  Weiter

 






Ähnliche Beiträge
Thema Forum Antworten
Places Eintrag doppelt aber nur einmal im Dashboard Places Eintrag doppelt aber nur einma... ezekiel Universal Search 4 12.12.2011, 13:03 Places Eintrag doppelt aber nur einmal im Dashboard
Backlinktest einmal mit www und einmal ohne! Backlinktest einmal mit www und einma... Joy81 Google Forum 3 12.11.2011, 17:41 Backlinktest einmal mit www und einmal ohne!
Onlineshop: Kategorien noch einmal im Footer verlinken Onlineshop: Kategorien noch einmal im... InsOp Ich hab' da mal 'ne Frage 23 01.07.2011, 17:58 Onlineshop: Kategorien noch einmal im Footer verlinken
[B]Auch wenn´s einmal schnell gehen muss, ich bin für Sie da [B]Auch wenn´s einmal schnell gehen m... Finance&Forex Marktplatz: Dienstleistungen 0 17.05.2011, 11:27 [B]Auch wenn´s einmal schnell gehen muss, ich bin für Sie da
Von Anfang an auf Seite 16 jetzt auf einmal weg Von Anfang an auf Seite 16 jetzt auf ... junak Google Forum 5 29.03.2011, 10:14 Von Anfang an auf Seite 16 jetzt auf einmal weg
internetmarketing einmal anders internetmarketing einmal anders mano_negra Offtopic, Spaßecke und alle sonstigen Themen 5 26.03.2011, 00:05 internetmarketing einmal anders
Und wieder einmal .httaccess Und wieder einmal .httaccess devolo01 Webprogrammierung, Templatedesign & Microformats 1 10.12.2010, 15:49 Und wieder einmal .httaccess

Suchmaschinenoptimierung | Latent Semantische Optimierung (LSO) | SEO Blog | SEO Online Tools | Suchmaschinenmarketing Angebot | Online Marketing

Impressum

Dieses SEO Forum läuft unter phpBB.


Sie lesen gerade: str_replace nur einmal ausführen