2012-04-16 10 views
5

Attualmente sto sviluppando un'applicazione Web per scaricare lo stream di Twitter e cercando di creare un processo di elaborazione naturale del mio.Stringa di divisione contenente lettere e numeri non separati da alcun delimitatore specifico in PHP

Poiché i miei dati provengono da Twitter (limitato a 140 caratteri) ci sono molte parole abbreviate, o in questo caso, spazio omesso.

Ad esempio:

"Hi, my name is Bob. I m 19yo and 170cm tall" 

Dovrebbe essere token a:

- hi 
- my 
- name 
- bob 
- i 
- 19 
- yo 
- 170 
- cm 
- tall 

noti che 19 e yo in 19yo hanno spazio tra di loro. Lo uso principalmente per estrarre numeri con le loro unità.

Semplicemente, ciò di cui ho bisogno è un modo per "esplodere" ogni token che contiene un numero di numeri o lettere senza delimitatore.

'123abc' saranno ['123', 'abc']

'abc123' saranno ['abc', '123']

'abc123xyz' sarà ['abc', '123', 'xyz']

e così via.

Qual è il modo migliore per ottenerlo in PHP?


Ho trovato qualcosa vicino ad esso, ma è C# e spesifically per la divisione giorno/mese. How do I split a string in C# based on letters and numbers

+1

#giustamente curioso, perché hai bisogno di un'estrazione del genere? – hjpotter92

+1

Potrei vedere questo per la creazione dinamica di slug, ma potrebbe anche essere fatto con delimitazione spazio/punteggiatura. – Dutchie432

+0

@ chasing-death perché la fonte dei dati (flusso twitter) ha scrittura incoerente – akhyar

risposta

7

È possibile utilizzare preg_split

$string = "Hi, my name is Bob. I m 19yo and 170cm tall"; 
$parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $string); 
var_dump ($parts); 

Quando la corrispondenza con la cifra-lettera di confine, il match espressione regolare deve essere zero-width. I personaggi stessi non devono essere inclusi nella partita. Per questo sono utili zero-width lookarounds.

http://codepad.org/i4Y6r6VS

+0

Sì, non sembra funzionare correttamente. (http://codepad.org/4lWwbs4g) – Dutchie432

+0

Neanche sull'input fornito (http://codepad.org/NsTWhhDX) – jprofitt

+0

Mi spiace, non l'ho mai verificato. Non sapevo che esistesse codepad.org. Ne farà uso ora. –

1

come su questo:

di estrarre i numeri da stringa utilizzando espressioni regolari, memorizzarli in un array, sostituire i numeri nella stringa con qualche tipo di carattere speciale, che sarà 'hold' la loro posizione . e dopo aver analizzato la stringa creata solo dai tuoi caratteri speciali e caratteri normali, invierai i tuoi numeri dall'array ai loro posti riservati.

solo un'idea, ma imho potrebbe funzionare per voi.

MODIFICA: tenta di eseguire questo codice breve, si spera che vedrete il mio punto nell'output. (questo codice non funziona su codepad, non so perché)

<?php 
$str = "Hi, my name is Bob. I m 19yo and 170cm tall"; 
preg_match_all("#\d+#", $str, $matches); 
$str = preg_replace("!\d+!", "#SPEC#", $str); 

print_r($matches[0]); 
print $str; 
+0

interessante, ma anche un po 'di confusione per me .. potresti darmi qualche spiegazione aggiuntiva? – akhyar

+0

risposta modificata, controlla. se hai bisogno di più spiegazioni, chiedi, sostieni la soluzione completa dopo aver dormito;) – xholicka

Problemi correlati