2015-06-10 2 views
-1

Я ищу способ разделить строку в несколько слов на основе некоторых разделителей.Как разбить строку на несколько разделителей, сохраняя некоторые разделители?

Например строка word1&word2 !word3 word4 &word5 должен дать мне массив со следующими словами:

word1 
&word2 
!word3 
word4 
&word5 

Как достичь этого? Я попробовал несколько решений с str_replace(), но я не могу найти лучший способ получить то, что мне нужно. Возможно, решение может использовать регулярные выражения, но я не знаю, как их использовать.

+0

вы должны смотреть, как использовать взрываются, здесь http://php.net/explode – keikoku92

+0

Очевидно, я уже видел эту страницу, но там нет все могло мне помочь. Я ошибаюсь? – smartmouse

+0

@ keikoku92 'explode' будет работать только в том случае, если в строке есть один согласованный разделитель, такой как запятая. Здесь есть несколько возможностей. – Ankh

ответ

2

Попробуйте это:

$src='word1&word2 !word3 word4 &word5'; 
$arr=explode(' ',$src=preg_replace('/(?<=[\w])([&!])/',' $1',$src)); 
echo join('<br>',$arr); // present the result ... 

Первая замена любого из встречаемости группы, состоящей из одного символа класса [&!], который предшествует «word'-символа в ' $1' (= сам по себе, предшествует пробел) а затем explode() строка, использующая пробелы в качестве разделителей.

Если вам нужно иметь дело с несколькими пробелами в качестве разделителей между словами, вы могли бы, конечно, заменить (быстрее) explode(' ',...) с небольшим количеством «уточненных» preg_split('/ +/',...).

+0

Он работает, но как его отредактировать, если я встречаю строки, содержащие слово «word1! Word2». В этом случае он не разделяется. – smartmouse

+0

Только что отредактировал мой ответ: используйте группу, состоящую из одного символа, принадлежащего классу символов '[&!]' Вместо одиночного символа '&', и замените его своим собственным появлением ('$ 1'). – cars10m

+0

Большое вам спасибо! Это очень здорово! – smartmouse

1

Вы можете использовать preg_split и выполнить некоторую настройку по мере необходимости. смотри пример ниже: -

function customExplode($string){ 
    if($matches = preg_split('/[\s&!]+/i', $string, null, PREG_SPLIT_OFFSET_CAPTURE)){ 
     $return = array(); 
     foreach ($matches as $match) { 
      $return[] = (($match[1]-1) >= 0) ? substr($string, $match[1]-1, 1).$match[0] : $match[0]; 
     } 
     return $return; 
    } else { 
     return $string; 
    } 
} 
$word = 'word1&word2 !word3 word4 &word5'; 
print_r(customExplode($word)); 

Результаты

Array 
(
    [0] => word1 
    [1] => &word2 
    [2] => !word3 
    [3] => word4 
    [4] => &word5 
) 
Смежные вопросы