Sintassi delle espressioni regolari In PHP per estrarre tutte le istanze di un formato

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

  •  10-07-2019
  •  | 
  •  

Domanda

Sto tentando di estrarre tutte le istanze di un particolare formato da una stringa:

  

Mi chiedo se la mia nuova Sony [PT # 123456ABC; Sony] ha questa funzione ma il mio amico dice che il nuovo Toshiba [PT # AD-3232hjk; Toshiba] ha questa funzione.

Vorrei estrarre:

  

[PT # 123456ABC; Sony]

     

[PT # AD-3232hjk; Toshiba]

Come puoi vedere qui, gli unici elementi nelle posizioni coerenti sono:

  • [PT #
  • ;
  • ]

Stavo tentando di usare vari tipi di strpos () ma a causa delle lunghezze e dei formati variabili dei numeri di parte e dei nomi dei produttori non sono stato in grado di estrarre in modo affidabile quelle istanze da una stringa molto più grande. Ho provato vari modi per utilizzare le espressioni regolari per risolvere questo problema, tuttavia la mia conoscenza con loro è piuttosto limitata. Dopo aver estratto e inserito queste espressioni in variabili, dovrò quindi separare i numeri di parte e i nomi dei produttori dall'espressione. Questo può anche essere più facile da realizzare usando espressioni regolari.

Qualsiasi aiuto è apprezzato. Grazie

È stato utile?

Soluzione

Penso che questo lo farebbe

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

print_r( $matches );

In alternativa, se volevi solo acquisire informazioni uniche

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

Altri suggerimenti

$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";
}

Immagino che leggerai da un file di testo contenente molte di queste voci. Quello che puoi fare è:

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

inserirà tutte le corrispondenze nell'array $ result e potrai accedervi in ??questo modo:

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

$ result è una colonna ordinata maggiore e la prima voce in una corrispondenza è la stringa di corrispondenza completa

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

Spero che aiuti

EDIT: risolto il problema con regex, dovrebbe funzionare ora (ancora non testato)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top