2010-12-01 15 views
0

Hallo, ich brauche eine bestimmte Art von String ersetzen in PHP. Ich muss ein Wort durch zwei verschiedene andere Wörter ersetzen.string ersetzen php - ein Wort zu mehr Wörter

Zum Beispiel: in der Zeichenfolge "Hallo Mama, Hallo Papa" muss ich das Wort "Hallo" automatisch durch zwei andere, zum Beispiel "Mary" und "John" ersetzen. Wenn also nur ein Vorkommen von "Hi" auftritt, wird nur durch "mary" ersetzt, aber wenn es mehr als eins gibt, wird die gesamte Wortverbindung verwendet.

Also ersetzt ein Wort mehr basierend auf wie oft das Wort Vorkommen. Danke an alle, die mir helfen können!

+0

Eine Frage lässt, sagen youve „Hallo Mama, hallo Papa , hi grampa "würde es wieder mit mary und john beginnen oder wäre es peter. – Trufa

Antwort

3

preg_replace_callback können Sie jeden Ersatz steuern.

+1

Dies ist die Lösung für Ihr Problem, wenn Sie mich fragen, werfen Sie einen Blick auf mein Beispiel, um eine funktionierende Version dessen zu sehen, wonach Sie suchen. (+1) – Michael

0

Man könnte dies mit mehreren Anrufen zu preg_replace erreichen, eine Grenze von 1 für jeden Anruf spezifiziert:

$string = "Hi mom, hi dad"; 

preg_replace('/hi/i', 'mary', $str, 1); // "mary mom, hi dad" 
preg_replace('/hi/i', 'john', $str, 1); // "mary mom, john dad" 

du wie die folgenden mit etwas verallgemeinern kann. Es braucht ein Thema, ein Muster und 1 oder mehr Ersatzwörter.

function replace_each($subject, $pattern, $replacement) { 

    $count = 0; 
    for ($i = 2; $i < func_num_args(); ++$i) { 
    $replacement = func_get_arg($i); 
    $subject = preg_replace($pattern, $replacement, $subject, 1, $count); 
    if (!$count) 
     // no more matches 
     break; 
    } 
    return $subject; 
} 

$string = preg_replace_each("Hi mom, hi dad", "/hi/i", "mary", "john"); 

echo $string; // "mary mom, john dad" 
0

preg_replace_callback ist eine Art und Weise, ist ein anderer $ Limit und $ count Parameter von preg_replace zu nutzen (siehe manpage)

$str = "hi foo hi bar hi baz hi quux"; 
$repl = array('uno', 'dos', 'tres'); 

do{ 
    $str = preg_replace('~hi~', $repl[0], $str, 1, $count); 
    $repl[] = array_shift($repl); // rotate the array 
} while($count > 0);  
0

Ich bin nicht sicher, ob es eine wirklich einfache Möglichkeit, es zu tun aber sieh dir diesen Code an, den ich gerade geschrieben habe. Dies sollte den Trick für Sie tun

<?php 
class myReplace{ 
    public $replacements = array(); 
    protected $counter = 0; 

    public function __construct($replacements) { 
     // fill the array with replacements 
     $this->replacements = $replacements; 
    } 

    public function test($matches) { 
     // if you want you could do something funky to the matches array here 

     // if the key does not exists we are gonna start from the first 
     // array element again. 
     if(!array_key_exists($this->counter, $this->replacements)) { 
     $this->counter = 0; 
     } 

     // this will return your replacement. 
     return $this->replacements[$this->counter++]; 
    } 
} 

// Instantiate your class here, and insert all your replacements in sequence 
$obj = new myReplace(array('a', 'b')); 

// Lets start the replacement :) 
echo preg_replace_callback(
    "/hi/i", 
    array($obj, 'test'), 
    "Hi mom, hi dad, hi son, hi someone"   
); 
?> 

Dieser Code wird zur Folge haben :) in: eine Mutter, b Vater, ein Sohn, b jemand