2013-02-18 17 views
9

OK, così mi è stato alle prese con questo regex per le età e non riesco a farlo funzionare.PHP espressione regolare per abbinare parole

quello che voglio fare:

Data una stringa che voglio un array di stringhe contenente parole, ciascuno preceduto da qualsiasi carattere non di parola. stringa di input

Esempio:

one "two" (three) -four-

Le parole nella stringa può essere qualsiasi cosa, anche senza senso, con qualsiasi quantità di punteggiatura o simboli.

Quello che mi piacerebbe vedere:

array: 
one 
"two 
" (three 
) -four 
-

In sostanza, per ogni partita l'ultima cosa che è una parola, preceduta da qualcosa di sinistra sopra dal match precedente.

Come indicato in questa domanda titolo userò questo in PHP, ho provato varie combinazioni di preg_match_all() e preg_split(), con modelli contenenti molte varianti di "\ w", "\ b", "[^\ w] "e così via.

Avere un'ampia

Essenzialmente ho semplicemente desidera inserire un * dopo ogni parola nella stringa per scopi di ricerca.

Io davvero non sono una persona regex, quindi l'aiuto è apprezzato!

+0

Nella tua * Quello che vorrei vedere * parte, è la citazione dopo 'four' supposti di essere sulla riga successiva? – LeonardChallis

+0

Lei ha ragione, le quotazioni sembrano essere stati alterati quando ho postato, ho fissato ora, speriamo che si porta avanti in modo corretto questo momento. – Testic

risposta

8

Se si desidera aggiungere un asterisco dopo ogni "parola" si potrebbe fare questo:

<?php 
$test = 'one "two" (three) -four-'; 

echo preg_replace('/(\w+)/', "$1*", $test); 
?> 

http://phpfiddle.org/main/code/8nr-bpb

+0

Questo funziona anche splendidamente! Probabilmente userò questo perché mi eviterà di ripetere in sequenza le partite. – Testic

7

È possibile utilizzare un lookahead negativo per dividere su confini di parola, in questo modo:

$array = preg_split('/(?!\w)\b/', 'one "two" (three) -four-'); 

A print_r($array);gives you l'uscita esatta desiderata:

Array 
(
    [0] => one 
    [1] => "two 
    [2] => " (three 
    [3] =>) -four 
    [4] => - 
)
+0

Questo funziona splendidamente! – Testic

0

qui un esempio di come trovare una parola con regex in PHP.

<?php 
$subject = "abcdef"; 
$pattern = '/^def/'; 
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE); 
print_r($matches); 
?> 
0

Un'alternativa

[^\w]*(\b\w*\b)? 
----- ---------- 
|  | 
|  |->matches a word 0 or 1 time 
|->matches 0 to many characters except [a-zA-Z0-9_] 

È necessario abbinare !

Problemi correlati