Sintaxis de expresiones regulares en PHP para extraer todas las instancias de un formato

StackOverflow https://stackoverflow.com/questions/837550

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy intentando extraer todas las instancias de un formato particular de una cadena:

  

Me pregunto si mi nueva Sony [PT # 123456ABC; Sony] tiene esta característica pero mi amigo dice que el nuevo Toshiba [PT # AD-3232hjk; Toshiba] tiene esta característica.

Me gustaría extraer:

  

[PT # 123456ABC; Sony]

     

[PT # AD-3232hjk; Toshiba]

Como puede ver aquí, los únicos elementos en las posiciones consistentes son:

  • [PT #
  • ;
  • ]

Intenté usar varios tipos de strpos () pero debido a las diferentes longitudes y formatos de los números de pieza y los nombres de los fabricantes, no pude extraer esas instancias de una cadena mucho más grande. He intentado varias formas de usar expresiones regulares para resolver esto, sin embargo, mi conocimiento con ellas es bastante limitado. Después de extraer y colocar estas expresiones en variables, necesitaré separar los números de parte y los nombres de los fabricantes de la expresión. Esto también puede ser más fácil de lograr usando expresiones regulares.

Cualquier ayuda es apreciada. Gracias

¿Fue útil?

Solución

Creo que esto lo haría

preg_match_all( "/(\[PT#\s+.*?;\s+.*?\])/", $input, $matches );

print_r( $matches );

Alternativamente, si solo desea capturar la información única

preg_match_all( "/\[PT#\s+(.*?);\s+(.*?)\]/", $input, $matches );

Otros consejos

$matches = array();
preg_match_all( "/\[PT#([^\];]+);([^\]]+)\]/", $input, $matches,  PREG_SET_ORDER);

foreach ($matches as $match) {
  echo "id=", trim($match[1]), " brand=", trim($match[2]), "\n";
}

Supongo que leerás de un archivo de texto que contiene muchas de esas entradas. Lo que puedes hacer es:

preg_match_all("/\[PT#(.*?);[.*]?(.*?)\]/i", $text, $result);

colocará todas las coincidencias en la matriz $ result y puede acceder a ellas de la siguiente manera:

echo $result[1][0]; //echos first occurrence's serial

$ result se ordena en la columna principal y la primera entrada en una coincidencia es la cadena de coincidencia completa

echo $result[0][0]; // would print [PT# 123456ABC; Sony]
echo $result[1][0]; // would print 123456ABC
echo $result[2][0]; // would print Sony

Espero que ayude

EDITAR: se corrigió la expresión regular, debería funcionar ahora (aún sin probar)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top