Usando PHP y regex, inserte un carácter entre un grupo de caracteres coincidentes

Me gustaría insertar un carácter entre un grupo de caracteres coincidentes usando expresiones regulares para definir el grupo y PHP para colocar el carácter dentro de la coincidencia. Mirando aquí Veo que puede requerir una coincidencia recursiva de PHP, aunque imagino que podría haber una forma más sencilla.

Para ilustrar, estoy intentando insertar un espacio en una cadena cuando hay una combinación de 2 o más letras adyacentes a un número. El espacio debe insertarse entre las letras y los números. El ejemplo, "AXR900DE3", debería devolver "AXR 900 DE 3".

¿Podría una respuesta usar preg_split para dividir la cadena de forma iterativa e insertar espacios en el camino? Comencé a intentar usar preg_replace a continuación para el patrón 2 + letras seguidas de un número (también necesitaré usar un patrón, un número seguido de 2 + letras), pero necesito otro paso para insertar el espacio entre esa coincidencia .

$sku = "AXR900DEF334";
$string = preg_replace('/(?<=[A-Z]{2}[\d])/',' ', $sku);

preguntado el 10 de mayo de 11 a las 13:05

4 Respuestas

No necesitas hacer recursivo. Si te he entendido correctamente, deberías poder hacer esto:

$sku = "AXR900DEF334";
$string = preg_replace('/((?<=[A-Z]{2})(?=[0-9])|(?<=[0-9])(?=[A-Z]{2}))/',' ', $sku);
echo $string;

SALIDA

AXR 900 DEF 334

Esto coincidirá tanto cuando las letras precedan y vengan después de los dígitos.

contestado el 10 de mayo de 11 a las 18:05

Prueba este código php:

<?php
$sku = "AXR900DEF334";
$s = preg_replace('/(?<=[A-Z]{2})([\d])/', ' $1', $sku);
var_dump($s);
?>

SALIDA

string(14) "AXR 900DEF 334"

contestado el 10 de mayo de 11 a las 18:05

También debe haber un espacio entre "900" y "DEF". - Josh M.

@Josh M. Pensé que OP escribió attempting to insert a space in a string when there is a combination of 2 or more letters adjacent to a number y 900DEF comienza con un número, por lo que no coincide con la declaración anterior. - anubhava

No estoy seguro, a mí me pareció que podría ser AA00 o 00AA y en ambos casos se debería insertar un espacio. Ya veremos. - Josh M.

Sí, se insertaría un espacio en ambos espacios. ¿Qué hace el "$ 1" en '$ 1'? - Dylanotron

Prueba esto:

<?php
$sku = "AXR900DEF334";
$string = preg_replace('/([A-Z]{2,})([\d])/','\1 \2', $sku);
echo "$string\n";
?>

contestado el 10 de mayo de 11 a las 18:05

Puede que necesite utilizar dos expresiones:

Agrega un espacio entre caracteres y números:

$sku = "AXR900DEF334";
$sku = preg_replace('/([A-Z]{2,})([\d])/','\1 \2', $sku);

Y luego agregue un espacio entre números y caracteres:

$sku = preg_replace('/([\d])([A-Z]{2,})/','\1 \2', $sku);

contestado el 10 de mayo de 11 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.