2012-02-23 15 views
14
$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 

dovrebbe diventare:preg_replace con sostituzioni di array

Mary and Jane have apples. 

In questo momento sto facendo in questo modo:

preg_match_all('/:(\w+)/', $string, $matches); 

foreach($matches[0] as $index => $match) 
    $string = str_replace($match, $replacements[$index], $string); 

posso fare questo in un unico passaggio, usando qualcosa come preg_replace ?

+1

[Questo] (http://codepad.org/KfP3g02m) è come si può fare con un array associativo. – Teneff

risposta

10

Si potrebbe usare preg_replace_callback con un callback che consuma le vostre sostituzioni uno dopo l'altro:

$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 
echo preg_replace_callback('/:\w+/', function($matches) use (&$replacements) { 
    return array_shift($replacements); 
}, $string); 

uscita:

Mary and Jane have apples. 
+0

il modificatore e è stato deprezzato dal PHP v.5.5 – Kareem

+1

@Karim: Giusto, lo hanno rimosso dalla risposta. Grazie per il puntatore. – hakre

8
$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 

echo preg_replace("/:\\w+/e", 'array_shift($replacements)', $string); 

uscita:

Mary and Jane have apples. 
+0

Non funzionerà su HHVM? – Mario

3

Per un multipl e e la sostituzione completa array associativo chiave è possibile utilizzare questo per abbinare il vostro modello di espressione regolare:

$words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow"); 
    $source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ ... _animal_sound_ , _no_match_"; 


    function translate_arrays($source,$words){ 
    return (preg_replace_callback("/\b_(\w*)_\b/u", function($match) use ($words) { if(isset($words[$match[0]])){ return ($words[$match[0]]); }else{ return($match[0]); } }, $source)); 
    } 


    echo translate_arrays($source,$words); 
    //returns: Hello! My Animal is a cat and it says MEooow ... MEooow , _no_match_ 

* Avviso, questo è anche se "_no_match_" manca di traduzione, sarà abbinare durante espressione regolare, ma preservare la sua chiave. E i tasti possono essere ripetuti molte volte.

+0

Raccomando di aggiungere il modificatore "u" alla regex per supportare le stringhe UTF-8: '/ \ b _ (\ w *) _ \ b/u'. BTW, il codice sopra riportato ha un errore di sintassi e una parentesi aggiuntiva alla fine. – nikoskip

+0

Sembra che non ci siano problemi di parentesi, ho verificato il codice e sto funzionando bene. BUt ho aggiunto l'UTf-8. Grazie – Miguel

Problemi correlati