Разделить текст, используя несколько разделителей, на массив обрезанных значений

У меня есть группа строк, которые мне нужно разделить на массив. Строка должна быть разделена на /, ,, with или &.

К сожалению, строка может содержать две строки, которые необходимо разделить, поэтому я не могу использовать split() или explode().

Например, строка может содержать first past/ going beyond & then turn, поэтому я пытаюсь получить массив, который будет возвращаться:

array('first past', 'going beyond', 'then turn')

Код, который я сейчас использую,

$splittersArray=array('/', ',', ' with ','&');
foreach($splittersArray as $splitter){
    if(strpos($string, $splitter)){
        $splitString = split($splitter, $string);
        foreach($splitString as $split){

Кажется, я не могу найти функцию в PHP, которая позволяет мне это сделать. Нужно ли мне передавать строку обратно в верхнюю часть воронки и продолжать проходить через foreach() после того, как строка снова и снова разбивается?

Это кажется не очень эффективным.


person pedalpete    schedule 21.05.2009    source источник
comment
К сожалению, строка может содержать две строки, которые необходимо разделить, поэтому я не могу использовать функцию разделения или взрыва. можешь объяснить, что ты имеешь в виду?   -  person Paolo Bergantino    schedule 21.05.2009
comment
Я просто добавил пример, чтобы пояснить   -  person pedalpete    schedule 21.05.2009


Ответы (2)


Используйте регулярное выражение и preg_split.

В случае, если вы упомянули, вы получите разделенный массив с помощью:

$splitString = preg_split('/(\/|\,| with |\&/)/', $string);
person Neal Maloney    schedule 21.05.2009

Чтобы кратко написать шаблон, используйте класс символов для односимвольных разделителей и добавьте разделитель with в качестве значения после вертикальной черты (символ или в регулярном выражении). Разрешить ноль или более пробелов по обе стороны от группы разделителей, чтобы значения в выходных данных не нужно было обрезать.

Я использую флаг функции PREG_SPLIT_NO_EMPTY на тот случай, если в начале или в конце строки встречается разделитель, и вы не хотите, чтобы были сгенерированы какие-либо пустые элементы.

Код: (Демо)

$string = 'first past/ going beyond & then turn with everyone';

var_export(
    preg_split('~ ?([/,&]|with) ?~', $string, 0, PREG_SPLIT_NO_EMPTY)
);

Выход:

array (
  0 => 'first past',
  1 => 'going beyond',
  2 => 'then turn',
  3 => 'everyone',
)
person mickmackusa    schedule 10.03.2021