Ho una stringa la cui sintassi corretta è la regex ^([0-9]+[abc])+$
. Quindi esempi di stringhe valide sarebbero: '1a2b' o '00333b1119a555a0c'PHP: dividere una stringa di gruppi alternati di caratteri in una matrice
Per chiarezza, la stringa è un elenco di coppie (valore, lettera) e l'ordine è importante. Sono bloccato con la stringa di input, quindi non posso cambiarlo. Durante il test per la sintassi corretta sembra facile in linea di principio con l'espressione regolare di cui sopra, sto cercando di pensare il modo più efficiente in PHP per trasformare una stringa compatibile in una matrice di qualcosa di utilizzabile come questo:
ingresso:
'00333b1119a555a0c'
uscita:
array (
0 => array('num' => '00333', 'let' => 'b'),
1 => array('num' => '1119', 'let' => 'a'),
2 => array('num' => '555', 'let' => 'a'),
3 => array('num' => '0', 'let' => 'c')
)
sto avendo difficoltà ad usare preg_match per questo. Ad esempio questo non fornisce il risultato atteso, l'intento è quello di corrispondere in modo avido con EITHER \ d + (e salvare ciò) OPPURE [abc] (e salvarlo), ripetuto fino alla fine della stringa raggiunta.
$text = '00b000b0b';
$out = array();
$x = preg_match("/^(?:(\d+|[abc]))+$/", $text, $out);
Questo non ha funzionato neanche, l'intento qui è quello di avidi-partita su \ d + [abc] (e salvare questi), ripetuta fino alla fine del stringa raggiunto, e dividerli in numeri e lettere in seguito.
$text = '00b000b0b';
$out = array();
$x = preg_match("/^(?:\d+[abc])+$/", $text, $out);
avevo programmato per controllare la sintassi come parte della preg_match, quindi utilizzare l'uscita preg_match per greedy-match i 'blocchi' (o mantenere i delimitatori se si utilizza preg_split), quindi se necessario scorrere il risultato 2 articoli alla volta usando for (...; i+=2)
per estrarre la lettera di valore nelle loro coppie.
Ma non riesco nemmeno a ottenere quell'approccio basilare preg_split() o preg_match() per funzionare senza intoppi, né tanto meno esplorare se c'è un modo "più ordinato" o più efficiente.
Suggerire un controllo nell'ingresso $ input perché attualmente una stringa non valida produce comunque un risultato valido. Qualcosa come 'if (preg_match ('/^([0-9] + [abc]) + $ /', $ input) == 1) {...' – Tigger