2015-02-13 11 views
5

Supponiamo che io sono una stringa:Spalato il primo spazio e l'ultimo spazio in una stringa e limitare le dimensioni di output in 3

ABC DEF SASF 123 (35) 

E il mio risultato atteso come:

Array (
    [0] => ABC 
    [1] => DEF SASF 123 
    [2] => (35) 
) 

Sono cercando di fare questo con $str = preg_split("/(^\S+\s+)|\s+(?=\S+$)/",$str, 3); Ma il problema attuale è questo RegEx sostituirà il contenuto in $str[0] e sarebbe come

Array (
    [0] => 
    [1] => DEF SASF 123 
    [2] => (35) 
) 

Come posso modificare RegEx per ottenere il risultato atteso?

L'esempio on-line: https://www.regex101.com/r/rK5lU1/2

risposta

4

Basta dividere la stringa di input in base alla regex di seguito.

^\S+\K\s+|\s+(?=\S+$) 

Basta abbinare la prima parola e poi eliminarlo con l'aggiunta di \K accanto \S+. Quindi abbina i seguenti uno o più spazi. | O abbina uno spazio in più che era prima all'ultima parola. \S+ corrisponde a uno o più caratteri non spaziali.

DEMO

$str = "ABC DEF SASF 123 (35)"; 
$match = preg_split('~^\S+\K\s+|\s+(?=\S+$)~', $str); 
print_r($match); 

uscita:

Array 
(
    [0] => ABC 
    [1] => DEF SASF 123 
    [2] => (35) 
) 
2
^(\S+)\s+|\s+(?=\S+$) 

Prova scissione da questo. Codice d'esempio.

preg_split('/^(\S+)\s+|\s+(?=\S+$)/', 'ABC DEF SASF 123 (35)', -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) 

O semplicemente abbinare e catturare le catture invece di dividere.

^(\S+)\s+(.*?)\s+(\S+)$ 

See demo

$re = "/^(\\S+)\\s+(.*?)\\s+(\\S+)$/"; 
$str = "ABC DEF SASF 123 (35)"; 

preg_match_all($re, $str, $matches); 
+0

Il codice non funzionerebbe senza quelle bandiere. Non so perché non ne parli nemmeno. – nhahtdh

+0

La risposta accettata è più facile da capire e più semplice di questa soluzione IMO. – user3571945

+0

@ user3571945 yup hai il mio consenso.Tuttavia tutto funziona imparando più di 1 modo :) – vks

Problemi correlati