Intentar dividir previamente un archivo grande de varias líneas en una matriz

Tengo un archivo formateado como ...

archivo.txt

[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...

El formato es muy similar a (para aquellos familiares) smb.conf y esperaba tener una serie de "secciones" de cadenas al final de la misma. Al final, estoy buscando hacer un preg_split para tomar cada sección de texto y ponerla en una matriz así ...

Array
(
    [0] => [sectionone]
           ...
           ...
    [1] => [sectiontwo]
           ...
           ...
    [2] => [sectionthree]
           ...
           ...
)

Sé que podría leer el archivo línea por línea y crear una solución de esa manera, pero soy terco como el infierno y trato de resolver esto ya que se adapta a mis necesidades. La división debe ocurrir cuando un '[' (corchete) está al comienzo de cualquier línea y cualquier cosa que conduzca al siguiente corchete (líneas nuevas, pestañas, cualquier carácter, etc.) es juego limpio. La mayoría de mis intentos han resultado en nada o en una cantidad de 1 con TODO.

 $fileString = file_get_contents( '/tmp/archivo.txt' );
 print_r( preg_split( "/^\[.*\]\n$/", $fileString );

... da como resultado el indeseado ...

Array
(
    [0] => [sectionone]
           ...
           ...
           [sectiontwo]
           ...
           ...
           [sectionthree]
           ...
           ...
}

Cualquier ayuda sería muy apreciada ya que mis habilidades de expresión regular son, en el mejor de los casos, principiantes. Gracias por adelantado.

0
¿necesitas solo los nombres de las secciones? o necesita los valores en cada sección también?
agregado el autor bagonyi, fuente

3 Respuestas

¿Quizás podría usar preg_match_all en su lugar?

$fileString = '[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...';
preg_match_all("/^\[.*?(?=\n\[|\z)/ms", $fileString, $matches);
print_r($matches);

Esto coincidirá con [ hasta que encuentre un \ n seguido de un [ o al final de la cadena. Los indicadores ms son importantes aquí para hacer que ^ coincida con el comienzo de todas las líneas y para . para que coincida con las nuevas líneas.

O con la división ...

print_r(preg_split("/\n(?=\[)/", $fileString));

Esto coincidirá con un \ n solo si está seguido por un [.

0
agregado
Increíble. Muy bien hecho. Gracias.
agregado el autor Evan, fuente

Considere utilizar el parse_ini_file() o el parse_ini_string() función, que ya analiza un archivo en el mismo formatee como smb.conf en una matriz con los elementos de configuración.

Por ejemplo, dada la siguiente configuración sample.ini (ejemplo de parse_ini_file() documentos ) :

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

El siguiente código:

$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

Producirá:

Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )
)
0
agregado
En primer lugar, aprecio la respuesta. Ya pasó por ese camino y requiere un formato muy estricto. En mi caso, desafortunadamente, entre los encabezados de las secciones puede haber cualquier número de texto horrible, caracteres especiales, etc ... no solo x es igual a y. Todo lo que sé con certeza es que las secciones comenzarán con el corchete.
agregado el autor Evan, fuente
@Evan Ouch! Sí, en ese caso, es mejor con un analizador personalizado.
agregado el autor elias, fuente
@ bluegman991 Sí, lo noté, por eso dije que lo considerara: la pregunta no estaba clara si se había intentado. =)
agregado el autor elias, fuente
@Evan Trate de usar: preg_split ("/ ^ \ [[^ ^] + \] \ n $ /", $ fileString) - Creo que el . * es haciendo coincidir el último ] codiciosamente.
agregado el autor elias, fuente
Buena sugerencia pero dijo que es similar así que si no es lo mismo, tendría que cambiar su formato para que sea el mismo exacto .
agregado el autor bluegman991, fuente

Elimina el ^ y el $ de tu expresión regular.

Esto está provocando que PHP solo coincida con un corchete de apertura al comienzo de la cuerda y un corchete de cierre al final de la cuerda.

$fileString = file_get_contents( '/tmp/file.txt' );
print_r( preg_split( "/\[.*\]\r?\n/", $fileString );

Algo así debería funcionar mejor para ti.

0
agregado
Totalmente funciona, sin embargo, faltan los encabezados. Aunque aprecio la solución, ya que puedo usarla en otro lado.
agregado el autor Evan, fuente
PHP - Comunidad española
PHP - Comunidad española
6 de los participantes

En este grupo hablamos de PHP. Partner: es.switch-case.com