2013-12-24 6 views
2

У меня есть строка, как этот Hello? My name is Ben! @ My age is 32.Как изменить пункт в массив в PHP включая пробелы и точечностью

Я хочу, чтобы изменить его в массив со всеми словами, пробелы и знаки препинания как отдельные объекты в массив. Например, если я var_dump($sentence) массив должен выглядеть следующим образом:

array(12) { 
    [0]=> 
    string(5) "Hello" 
    [1]=> 
    string(1) "?" 
    [2]=> 
    string(1) " " 
    [3]=> 
    string(2) "My" 
    [4]=> 
    string(1) " " 
    [5]=> 
    string(4) "name" 
    [6]=> 
    string(1) " " 
    [7]=> 
    string(2) "is" 
    [8]=> 
    string(1) " " 
    [9]=> 
    string(3) "Ben" 
    [10]=> 
    string(1) "!" 
    [11]=> 
    string(1) " " 
    [12]=> 
    string(1) "@" 

и т.д ...

Единственный код, который я нашел, который подходит близко к этому является:

$sentence = preg_split("/(?<=\w)\b\s*/", 'Hello? My name is Ben! @ My age is 32.'); 

echo '<pre>'; 
var_dump($sentence); 
echo '</pre>'; 

который выходы:

array(10) { 
[0]=> 
string(5) "Hello" 
[1]=> 
string(4) ". My" 
[2]=> 
string(4) "name" 
[3]=> 
string(2) "is" 
[4]=> 
string(3) "Ben" 
[5]=> 
string(6) "! @ My" 
[6]=> 
string(3) "age" 
[7]=> 
string(2) "is" 
[8]=> 
string(2) "32" 
[9]=> 
string(1) "." 
} 

Как изменить это, чтобы пробелы и пунктуации были разделены в массиве ?

+1

Включить границу слова в группе захвата? –

ответ

2

Нет необходимости опережающего просмотра: просто сделать preg_split захвата разделителей, а также (с PREG_SPLIT_DELIM_CAPTURE вариант):

$str = 'Hello? My name is Ben! @ My age is 32.'; 
$arr = preg_split('/(\W)/', $str, null, 
    PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

Demo. При этой настройке каждый символ \W (без слова) записывается отдельно (как разделитель), но все символы \w собираются в последовательности (в виде частей строки, разделенных \W).