2011-06-03 20 views
17

¿Cómo puedo reemplazar un conjunto de palabras que se parecen:PHP - añadir subrayado antes mayúsculas

SomeText 

a

Some_Text 

?

+7

¿Por qué la etiqueta de navidad? :) – Yeroon

+0

mi error, lo siento ... pero ya no está – Alex

+0

* (relacionado) * [exploding-uppercasedcamelcase-to-upper-cased-camel-case-in-php] (http://stackoverflow.com/questions/3275837/exploding-uppercasedcamelcase-to-upper-cased-camel-case-in-php) – edorian

Respuesta

32

Este objetivo se lograría fácilmente usando una expresión regular:

$result = preg_replace('/\B([A-Z])/', '_$1', $subject); 

una breve explicación de la expresión regular:

  • \ B afirma la posición final de una palabra.
  • [A-Z] coincide con cualquier carácter en mayúscula de A-Z.
  • () envuelve el partido en un número de referencia de vuelta 1.

Luego reemplazamos con '_ $ 1', que significa reemplazar el partido con un [subrayado + retrorreferencia 1]

+0

wow, ¿cuál de estos es más rápido? – Alex

+0

Probablemente solo sea capaz de decir cuál es más rápido mediante la evaluación comparativa de su solución. La diferencia probablemente sea pequeña. Las operaciones se vuelven más lentas a medida que la expresión regular se vuelve más complicada. –

+0

Esto evita las afirmaciones de mirar hacia adelante y mirar hacia atrás, lo que en mi opinión lo hace más rápido. También es más legible. Solo significa insertar guión bajo antes de la letra mayúscula que viene después del límite sin palabras. –

9
$s1 = "ThisIsATest"; 
$s2 = preg_replace("/(?<=[a-zA-Z])(?=[A-Z])/", "_", $s1); 

echo $s2; // "This_Is_A_Test" 

Explicación:

La expresión regular utiliza dos de observación alrededor de las afirmaciones (una mirada detrás y uno de preanálisis) para encontrar puntos de la cadena en la que se debe insertar un guión.

(?<=[a-zA-Z]) # a position that is preceded by an ASCII letter 
(?=[A-Z])  # a position that is followed by an uppercase ASCII letter 

La primera aserción asegura que no se inserta un guión bajo al comienzo de la cadena.

3

La forma más sencilla de hacer esto es con un reemplazo de expresión regular.

Por ejemplo:

substr(preg_replace('/([A-Z])/', '_$1', 'SomeText'),1); 

La llamada substr no es eliminar uno de los principales '_'

3
<?php 

$string = "SomeTestString"; 
$list = split(",",substr(preg_replace("/([A-Z])/",',\\1',$string),1)); 
$text = ""; 

foreach ($list as $value) { 
    $text .= $value."_"; 
} 

echo substr($text,0,-1); // remove the extra "_" at the end of the string 

?> 
3

$result = strtolower(preg_replace('/(.)([A-Z])/', '$1_$2', $subject));

Convierte:

HelloKittyOlolo 
Declaration 
CrabCoreForefer 
TestTest 
testTest 

Para:

hello_kitty_ololo 
declaration 
crab_core_forefer 
test_test 
test_test