• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

1 Wort aus vielen ersetzen

lucarp

Mitglied
Hallo,

in dem Fall ist der Titel vielleicht nicht ganz sprechend gewählt..

ich habe schon mehrere super komplizierte Wege durchgespielt (im Kopf), denke aber, dass es doch auch eine simple Lösung geben muss.

ich habe einen Text in dem X mal das Wort xyz vorkommt. Ich möchte nun " nur eines" dieser Worte mit einem anderen ersetzen.

also suche ich sowas wie str_replace() was nur das xte vorkommen des Wortes ersetzt.

Das soll nachher durch ein zufallsprinzip ausgewäht werden können.
D.h. das Wort xyz kommt 7 mal vor. Dann soll eine zufallszahl zwischen 1 und 7 entscheiden welches Vorkommen ersetzt wird.

hat jemand eine Idee?

Danke
 
okay. aber wie genau soll ich das wort dann ersetzen.

ich hatte ja auch schon die idee den text per explode() an dem Wort zu trennen und danach, gemessen am count() des arrays diesen wieder zusammenzusetzen und das wort eben beim x ten Schleifendurchlauf mit dem neuen zu ersetzen.

Aber das scheint mir doch sehr kompliziert für so eine triviale Aufgabe. Oder nicht?
 
hm.. okay.. Also ich war eh zuversichtlich, dass ich es mit einem paar Zeilen Code hinbekomme.

Aber hätte ja sein können, dass es dafür schonmal eine schlaue Lösung gab :-)

danke
 
Na, ein riesen Projekt ist es ja nicht, viel mehr als 10 Zeilen Code sollten es kaum werden. Du hast wohl einen Einzeiler erwartet?
 
kannst du mir trotzdem nochmal genauer sagen wie du das machen würdest?

Denn substr_count() gibt ja z.B. nur die Anzahl der Vorkommen zurück aber dich die Positionen.
 
Ich würde mit strpos durch den text gehen, wobei ich mit jedem Schritt den offset erhöhen würde. Also ganz grob:

PHP:
$offset = 0;
$count = 0;
$pos = strpos($meinString, $findMich, $offset);
while ($pos !== false){
  $count++;
  ArrPositions[$count] = $pos;
  $offset = $pos + len($findMich);
  $pos = strpos($meinString, $findMich, $offset);
}
Danach hast mit $count die Anzahl und im ArrPositions das WO. Den Rest machst nun aber alleine.
 
Oder mit preg_match_all.

PHP:
<?php

function replaceRandomOccurrence($text, $searchTerm, $replacement)
{
    // See http://www.php.net/manual/en/regexp.reference.escape.php
    $pattern = '/\b' . preg_quote($searchTerm) . '\b/';
    $matches = array();

    $ret = preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);

    // If $text does not contain $searchTerm, return $text
    if ($ret === false || $ret === 0) {
        return $text;
    }

    $rand = mt_rand(0, $ret - 1);

    return substr($text, 0, $matches[0][$rand][1])
            . $replacement
            . substr($text, $matches[0][$rand][1] + strlen($searchTerm));
}

$text        = 'xyz abc xyz xyzdef xyz';
$searchTerm  = 'xyz';
$replacement = 'FOOBAR';

echo '"' . replaceRandomOccurrence($text, $searchTerm, $replacement) . '"';
 
Also ich habe es jetzt mit dem preg_match umgesetzt.

habe davor auch die andere Variante weitergsponnen und lauffähig gehabt, aber das preg_match gefällt mir etwas besser.

danke an alle :-)
 
Zurück
Oben