2011-05-17 25 views
6

por ejemplo, he siguiente cadena:PHP: PCRE: Cómo sustituir carbón repetible

a_b__c___d____e 

Cómo preg_replace Char _ charla '-', pero sólo si parte '__...' contiene más de N repitió _.

espero que me))

source: a_b__c___d____e 
cond: change '_' where 2 or more 
result: a_b--c---d----e 

o

source: a_b__c___d____e_____f 
cont: change '_' where 4 or more 
result: a_b__c___d----e-----f 

gracias entienden!

p.s. Solución interesante sin usar bucles. Cómo implementarlo con bucles (creo) conozco a alguien. Solo una regex y preg_replace.

Respuesta

2

Aquí hay otra usando el modificador e:

$str = 'a_b__c___d____e_____f'; 
echo preg_replace('/_{4,}/e', 'str_repeat("-", strlen("$0"))', $str); 

Reemplazar 4 por el número que necesita. O como función:

function repl($str, $char, $times) { 
    $char = preg_quote($char, '/'); 
    $times = preg_quote($times, '/'); 
    $pattern = '/' . $char . '{' . $times . ',}/e', 
    return preg_replace($pattern, 'str_repeat("-", strlen("$0"))', $str); 
} 
1
$source = 'a_b__c___d____e_____f'; 
function yourfunc($param) 
{ 
    $count = strlen($param); 
    $return = ''; 
    for ($i = 0; $i < $count; $i++) 
    { 
     $return .= '-'; 
    } 
    return $return; 
} 
echo preg_replace('#(_{4,})#e', 'yourfunc("$1");', $source); 

Una solución sin la función de devolución de llamada y el bucle es mucho más difícil de leer.

preg_replace('#(_{4,})#e', 'implode("", array_pad(array(), strlen("$1"), "-"));', $source); 
1

esta es la solución en línea:

preg_replace('/(_{2,})/ie', 'str_repeat("-",strlen("$1"));', $source); 

y funciton reutilizable:

$source = 'a_b__c___d____e_____f'; 


    function replace_repeatable($source,$char,$replacement,$minrepeat = 2) 
    { 
      return preg_replace('/(' . preg_quote($char) . '{' . $minrepeat . ',})/ie', 'str_repeat("' . $replacement . '",strlen("$1"));', $source); 
    } 

    $b = replace_repeatable($source,'_','-',4); 
0

como refiriéndose a php.net documenation usando modificador de e se desaconseja,

Esta característica tiene estado DEPURADO a partir de PHP 5.5.0. Confiar en esta característica es altamente desaconsejado.

así que será mejor que logremos nuestro objetivo sin utilizar este modificador.


Aquí está basado solución en un máximo de herramientas fecha de PHP:

$source = 'a_b__c___d____e'; 

echo preg_replace_callback("%(_{2,})%i", function($matches) {return str_repeat("-", strlen($matches[1])); }, $source); 
/* in callback function matches[0] is whole matched pattern, groups go like this matches[1],matches[2]... */ 

Incluso con e todavía disponibles en nuestro entorno PHP, por lo general es mejor utilizar la función de devolución de llamada - agradecimiento de regresar la llamada evitamos combinación bastante insegura de la función addslashes() y la evaluación de cadenas, ya que la ejecución de preg_replace con el modificador mencionado involucra ambas acciones a la vez.


Un preg_replace_callback ha estado disponible desde la versión 4.0.5, pero function($matches) {} es una función anónima que en realidad es mucho más nueva característica del lenguaje, para ejecutar este código u necesidad de PHP en la versión 5.3.0 o posterior .