solo regulares regular probar letras expresiones expresion espacios espacio ejemplos direccion casa blanco alfanumerico php regex string preg-split

php - probar - Empareja todas las subcadenas que terminan con 4 dígitos usando expresiones regulares



probar expresiones regulares (4)

No quieres preg_split , quieres preg_match_all :

$str = ''ABCDE1234ABCD1234ABCDEF1234''; preg_match_all(''/[a-z]+[0-9]{4}/i'', $str, $matches); var_dump($matches);

Salida:

array(1) { [0]=> array(3) { [0]=> string(9) "ABCDE1234" [1]=> string(8) "ABCD1234" [2]=> string(10) "ABCDEF1234" } }

Estoy tratando de dividir una cadena en PHP, que se parece a esto:

ABCDE1234ABCD1234ABCDEF1234

En una matriz de cadena que, en este caso, se vería así:

ABCDE1234 ABCD1234 ABCDEF1234

Así que el patrón es "un número indefinido de letras, y luego 4 dígitos, luego un número indefinido de letras y 4 dígitos, etc."

Estoy tratando de dividir la cadena usando preg_split de esta manera:

$pattern = "#[0-9]{4}$#"; preg_split($pattern, $stringToSplit);

Y devuelve una matriz que contiene la cadena completa (no dividida) en el primer elemento.

Estoy adivinando que el problema aquí es mi expresión regular, ya que no entiendo completamente cómo usarlos, y no estoy seguro de si lo estoy usando correctamente.

Entonces, ¿cuál sería la expresión regular correcta para usar?


No soy bueno en expresiones regulares, así que aquí está el camino menos transitado:

<?php $s = ''ABCDE1234ABCD1234ABCDEF1234''; $nums = range(0,9); $num_hit = 0; $i = 0; $arr = array(); foreach(str_split($s) as $v) { if(isset($nums[$v])) { ++$num_hit; } if(!isset($arr[$i])) { $arr[$i] = ''''; } $arr[$i].= $v; if($num_hit === 4) { ++$i; $num_hit = 0; } } print_r($arr);


PHP utiliza expresiones regulares de estilo PCRE que le permiten hacer una búsqueda sin pensar. Puede usar esto para ver si hay 4 dígitos "detrás" de usted. Combina eso con un lookahead para ver si hay una carta delante de ti, y obtienes esto:

(?<=/d{4})(?=[a-z])

Observe las líneas de puntos en la página de demostración de Debuggex . Esos son los puntos que quieres dividir.

En PHP esto sería:

var_dump(preg_split(''/(?<=/d{4})(?=[a-z])/i'', ''ABCDE1234ABCD1234ABCDEF1234''));


Usa el principio de contraste :

/D+/d{4} # requires at least one non digit # followed by exactly four digits

Vea una demostración en regex101.com .

En PHP esto sería:

<?php $string = ''ABCDE1234ABCD1234ABCDEF1234''; $regex = ''~/D+/d{4}~''; preg_match_all($regex, $string, $matches); ?>

Vea una demostración en ideone.com .