¿Cómo puedo reemplazar un conjunto de palabras que se parecen:PHP - añadir subrayado antes mayúsculas
SomeText
a
Some_Text
?
¿Cómo puedo reemplazar un conjunto de palabras que se parecen:PHP - añadir subrayado antes mayúsculas
SomeText
a
Some_Text
?
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:
Luego reemplazamos con '_ $ 1', que significa reemplazar el partido con un [subrayado + retrorreferencia 1]
wow, ¿cuál de estos es más rápido? – Alex
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. –
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. –
$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.
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 '_'
<?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
?>
$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
¿Por qué la etiqueta de navidad? :) – Yeroon
mi error, lo siento ... pero ya no está – Alex
* (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