Seite 1 von 1

PHP erstes vorkommen eines Strings ersetzen

Verfasst: 31.01.2012, 12:21
von axelm
Hi,

Ich habe einen Text in einer Variable und möchte gerne das erste vorkommen eines String durch einen anderen String ersetzen.

also zb das erste auftauchen des Wort SEO durch Suchmaschinenoptimierung ersetzen.

$textMain = 'es gibt viele SEO Leute im Forum. SEO ist wichtig für gute Platzierungen'

$textReplace = 'SEO'
$textNew = 'Suchmaschinen Optimierung'


Vorschläge?

Verfasst:
von

Verfasst: 31.01.2012, 12:28
von chris21
Preg_replace bietet Dir einen limit Parameter, um es z.B. auf eine Ersetzung zu begrenzen.

Verfasst: 31.01.2012, 12:33
von axelm
Preg_replace ist mir von der Performance zu teuer.
Will mit dem Server upgrade noch warten.

Verfasst: 31.01.2012, 12:43
von chris21
Dann nimm diese (bereits korrigierte) Variante von zombat:

https://stackoverflow.com/questions/125 ... irst-match

Verfasst: 31.01.2012, 18:56
von 800XE
chris21 hat geschrieben:Dann nimm diese (bereits korrigierte) Variante von zombat:

https://stackoverflow.com/questions/125 ... irst-match
machste mal nen Lasttest?
axelm hat geschrieben:Preg_replace ist mir von der Performance zu teuer.
Will mit dem Server upgrade noch warten.
oldSchool .... ab mitte 1980ger bzw Anfang 90ger

Code: Alles auswählen

 $text = ' läölä l äöl äöl äl äö lä öl äö';
$word_old = 'SEO';
$word_new = 'Suchmaschinenoptimierung';

Code: Alles auswählen

 
$word_old_len = strlen(  $word_old );
$pos1st = strpos( $text, $word_old );

$text_new  = substr( $text, 0, $pos1st );
$text_new .= $word_new;
$text_new .= substr( $text, $pos1st  +  $word_old_len );
so sollte das tun ....
eventuell noch ein +1 oder -1

Code: Alles auswählen

 
$text_new  = substr( $text, 0, $pos1st - 1 );
$text_new .= substr( $text, $pos1st  +  $word_old_len + 1 );

Verfasst: 01.02.2012, 18:36
von fettmme
axelm hat geschrieben:Preg_replace ist mir von der Performance zu teuer.
Will mit dem Server upgrade noch warten.
Micro-Optimierung ist meist übertrieben, führt aber oft zu schlechtem Code, im Sinne von schlecht wartbar.

Aus Interesse habe ich mit XDEBUG mal ein Profiling für einen Text mit 2038 Zeichen gemacht.

Ein einzelner Aufruf wird in Cachegrind nicht mal angezeigt. Bei einer Schleife mit 1.000 Ausführungen ergab das folgende Werte:

1.000 x preg_replace = 8,5 ms
2.000 x substr + 1.000 x strpos + 1.000 strlen = 6,3 ms

Im Vergleich dazu benötigte der Kram drumherum (auch als main bekannt :D ) 72ms.

Sowas ist zwar immer nur eine Momentaufnahme, ich würde an Deiner Stelle trotzdem preg_replace verwenden.