2012-10-02 17 views
5

Lo que quiero hacer es encontrar todos los espacios que están entre llaves, y luego reemplazarlos con otro carácter.Reemplazar todos los espacios que están dentro de llaves

Algo así como:

{The quick brown} fox jumps {over the lazy} dog 

para cambiarse:

{The*quick*brown} fox jumps {over*the*lazy} dog 

Ya búsquedas en línea, pero sólo esto es lo que tengo hasta ahora, y parece tan cerca de lo que realmente quiero .

preg_replace('/(?<={)[^}]+(?=})/','*',$string); 

Mi problema con el código anterior es que se reemplaza todo:

{*} fox jumps {*} dog 

que estaba buscando en tutoriales de expresiones regulares para averiguar cómo debo modificar el código anterior para sustituir sólo espacios, pero en vano . Cualquier contribución será muy apreciada.

Gracias.

+1

cadena Sólo explotar entre los espacios y luego gato la matriz resultante de nuevo junto con "*" en el medio. Lo siento, estoy demasiado cansado para escribir un ejemplo. – noel

Respuesta

5

Suponiendo que todas las llaves están anidados correctamente y que no hay llaves anidadas, puede hacerlo utilizando una aserción de búsqueda hacia delante:

$result = preg_replace('/ (?=[^{}]*\})/', '*', $subject); 

Esto coincide en lugar de un espacio sólo si la próxima corsé es un cierre corsé:

(?=  # Assert that the following regex can be matched here: 
[^{}]* # - Any number of characters except braces 
\}  # - A closing brace 
)  # End of lookahead 
+0

Gracias. Esto funcionó brillantemente. Sin embargo, estoy intentando una solución usando las funciones de cadena php (strpos, substr, etc.). ¿Sigues consejos usando regex? He leído que Regex es lento y tal. – Bibokid

+2

@Bibokid: Podría hacer un perfil de Zaffy y mi solución y descubrirlo: las expresiones regulares no son necesariamente lentas (pero a menudo están construidas de manera muy descuidada, haciéndolas lentas porque tienen que aplicar una solución bruta cuando hay una solución inteligente disponible) . En muchos casos, las bibliotecas de expresiones regulares están altamente optimizadas y pueden ser mucho más rápidas que cualquier solución que usted construya usando funciones de cadena. –

1

¿Qué tal esto:

$a = '{The quick brown} fox jumps {over the lazy} dog'; 
$b = preg_replace_callback('/\{[^}]+\}/sim', function($m) { 
    return str_replace(' ', '*', $m[0]); 
}, $a); 
var_dump($b); // output: string(47) "{The*quick*brown} fox jumps {over*the*lazy} dog" 
+0

Gracias. Intentaré esto también y compararé con las otras soluciones. – Bibokid

2

estoy reaccionando hasta años Le comentamos que no quiere usar expresiones regulares, solo manipulación de cadenas. Está bien, pero ¿por qué has escrito que estás buscando una expresión regular?

Solución wihout expresiones regulares:

<?php 

$str = "{The quick brown} fox jumps {over the lazy} dog"; 

for($i = 0, $b = false, $len = strlen($str); $i < $len; $i++) 
{ 
    switch($str[$i]) 
    { 
     case '{': $b = true; continue; 
     case '}': $b = false; continue; 
     default: 
     if($b && $str[$i] == ' ') 
      $str[$i] = '*'; 
    } 
} 

print $str; 

?> 
+0

Es solo que mientras esperaba una respuesta aquí en stackoverflow, estaba experimentando con una solución no regex que se me vino a la cabeza. Gracias por esto, voy a probar esto también. – Bibokid

Cuestiones relacionadas