2012-03-13 12 views
5

dal str_replace() corrispondenze ": nome" due volte in ": nome: nome_en" Voglio abbinare i risultati solo per l'intera parola. Volevo passare a preg_replace() a causa di this answer.str_replace: corrisponde solo a parola intera

$str = ":Name :Name_en"; 
echo $str . chr(10); 
$str = preg_replace('/\b' . ':Name' . '\b/i', '"Test"', $str); 
echo $str; 

Ma questo non funziona a causa del colon. Nessuna sostituzione ha luogo. Come sarà il RegExp?

\b è la parola limite. Ma penso che un colon non appartenga a tale limite di parole.

+2

Prima devi dirci qual è * la * definizione di "parola". – Jon

+0

Per me l'intera parola è ': Name',': Name_en' e così via. Per RegExp non lo so. – testing

+0

Questa non è una definizione, è un esempio. – Jon

risposta

9

non ti servono il limite della parola sull'inizio della stringa:

$str = preg_replace('/:Name\b/i', '"Test"', $str); 
+0

A volte è così facile. Hai un buon link dove RegExp come '/', '\ b','/i' sono facilmente spiegabili? – testing

+0

Non a caso :) Ho pensato che la documentazione di php.net fosse abbastanza buona – Evert

+0

Per coloro che cercano un buon collegamento - http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ – Styphon

1

Se la vostra utilizzando PHP 5+ è comunque possibile utilizzare str_replace.

$str = ":Name :Name_en"; 
echo $str . chr(10); 

// The final int limits the function to a single replace. 
$str = str_replace(':Name', '"Test"', $str, 1); 

echo $str; 
+0

Ma quale oggetto sostituisce? Il primo, l'ultimo ...? Nella mia applicazione potrebbe essere che questo cambia ... – testing

+1

Il primo. str_replace è sequenziale. – Bradmage

+1

Questo non sembra essere quello che dice la documentazione: 'count: se passato, questo sarà impostato sul numero di sostituzioni eseguite. Quindi è un riferimento variabile, non una costante – jokkedk

1

Se si desidera sostituire più parole chiave che sono un'associativa, qualcosa come un dizionario o segnaposto, è 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_ , _no_match_"; 

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

Returns: Ciao! Il mio animale è un gatto e si dice MEooow, _no_match_

Avviso, questo è anche se "_no_match_" manca traduzione, corrisponderà durante espressione regolare, ma preservare la sua chiave.

+0

Ciò consente più sostituzioni con chiavi diverse – Miguel

Problemi correlati