2012-03-13 11 views
5

Dado que str_replace() coincide con ": Nombre" dos veces en ": Nombre: Nombre_en" Quiero hacer coincidir los resultados para la palabra completa solamente. Quise cambiar a preg_replace() debido a this answer.str_replace: coincide con palabra completa solamente

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

Pero esto no funciona debido a los dos puntos. No ocurre reemplazo. ¿Cómo se vería el RegExp?

\b es el límite de la palabra. Pero creo que un dos puntos no pertenece a ese límite de palabras.

+2

Primero tiene que decirnos qué * su * definición de "palabra" es. – Jon

+0

Para mi, la palabra completa es ': Name',': Name_en' y así sucesivamente. Para RegExp no lo sé. – testing

+0

Eso no es una definición, es un ejemplo. – Jon

Respuesta

9

que no es necesario el límite de palabra en el comienzo de la cadena:

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

A veces es tan fácil. ¿Tienes un buen enlace donde se puedan explicar fácilmente RegExp como '/', '\ b','/i'? – testing

+0

No disponible :) Pensé que la documentación de php.net era bastante buena – Evert

+0

Para aquellos que buscan un buen enlace - http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ – Styphon

1

Si su uso de PHP 5+ todavía se puede utilizar 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

Pero qué elemento ¿Reemplaza? El primero, el último, ...? En mi aplicación podría ser que esto cambie ... – testing

+1

El primero. str_replace es secuencial. – Bradmage

+1

Eso no parece ser lo que dice la documentación: 'count: si se aprueba, se establecerá en la cantidad de reemplazos realizados. Por lo tanto, es una referencia variable, no una constante – jokkedk

1

Si desea reemplazar varias palabras clave que son una asociativa, algo así como un diccionario o marcadores de posición, se puede usar esto para que coincida con su patrón de expresión:

$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)); 

devoluciones: ¡Hola! Mi Animal es un gato y dice MEooow, _no_match_

Aviso, aunque "_no_match_" carece de traducción, coincidirá durante la expresión regular, pero conservará su clave.

+0

Esto permite múltiples reemplazos con diferentes claves – Miguel

Cuestiones relacionadas