preg_split cómo incluir el delimitador dividido en los resultados?

Tengo este patrón simple que divide un texto en períodos

$text = preg_split("/[\.:!\?]+/", $text); 

pero quiero incluir : o! al final de los elementos de la matriz

IE ahora para “bueno: noticias.everyone!” yo tengo:

 array("good","news","everyone",""); 

pero lo que quiero es:

 array("good:","news.","everyone!",""); 

Aqui tienes:

 preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

Cómo funciona: el patrón realmente convierte todo en un delimitador. Luego, para incluir estos delimitadores en la matriz, puede usar la constante PREG_SPLIT_DELIM_CAPTURE . Esto devolverá una matriz como:

 array ( 0 => '', 1 => 'good:', 2 => '', 3 => 'news.', 4 => '', 5 => 'everyone!', 6 => '', ); 

Para deshacerse de los valores vacíos, use PREG_SPLIT_NO_EMPTY . Para combinar dos o más de estas constantes, usamos el bitwise | operador. El resultado:

 array ( 0 => 'good:', 1 => 'news.', 2 => 'everyone!' ); 

No use PREG_SPLIT_DELIM_CAPTURE si usa un aspecto positivo detrás de su patrón. La función mantendrá los delimitadores.

 $text = preg_split('/(?<=[.:!?])/', 'good:news.everyone!', 0, PREG_SPLIT_NO_EMPTY); 

Si usa lookbehind , solo buscará el personaje sin coincidir con él. Entonces, en el caso de preg_split() , la función no descartará el carácter.

El resultado sin el indicador PREG_SPLIT_NO_EMPTY :

 array ( 0 => 'good:', 1 => 'news.', 2 => 'everyone!', 3 => '' ); 

El resultado con el indicador PREG_SPLIT_NO_EMPTY :

 array ( 0 => 'good:', 1 => 'news.', 2 => 'everyone!' ); 

Puede probarlo usando este Probador de funciones en línea de PHP .