preg_split строка пробелами, не заключенными в одинарные кавычки

#php #regex #preg-split

#php #регулярное выражение #preg-split

Вопрос:

Я пытаюсь предварительно разделить строку пробелами не между одинарными кавычками.

Это строка, с которой я работаю:

 'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32
  

Следующий шаблон регулярного выражения успешно соответствует пространству, на которое я хочу разделить:

 /x20(?=[^']*('[^']*'[^']*)*$)g
  

Проблема, с которой я столкнулся, заключается в том, что я написал эту строку, используя http://www.regexr.com / это специфично для регулярных выражений JavaScript, и мне это нужно для работы в PHP.

Это PHP-код, который у меня есть на данный момент, но он выдает ошибку:

 preg_split("/x20(?=[^']*('[^']*'[^']*)*$)/g", "'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32");
  

Ошибка:

 preg_split(): Unknown modifier 'g'
  

Если я удаляю / и / g, я получаю следующую ошибку:

 preg_match_all(): Compilation failed: nothing to repeat at offset 0
  

Я предполагаю, что по какой-то причине регулярное выражение в PHP не соответствует никаким значениям, поэтому оно не может разделить строку. Может кто-нибудь помочь с тем, как правильно это сделать?

Спасибо.

Ответ №1:

Удалите g (глобальный) модификатор из вашего регулярного выражения.

 preg_split("/x20(?=[^']*('[^']*'[^']*)*$)/", "'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32");
  

Рабочая демонстрация

Хотя ваше регулярное выражение будет работать, вы могли бы использовать следующее, что значительно упрощает игнорирование пробелов в кавычках.

 $results = preg_split("/'[^']*'(*SKIP)(*F)|x20/", $str);
print_r($results);
  

Объяснение:

Идея состоит в том, чтобы пропускать содержимое в одинарных кавычках. Сначала я сопоставляю кавычку, за которой следует любой символ, кроме ' , за которым следует одинарная кавычка, а затем вызываю сбой подшаблона и заставляю механизм регулярных выражений не повторять попытку подстроки с другой альтернативой с (*SKIP) и (*F) возвращающими управляющими глаголами.

Вывод

 Array
(
    [0] => 'physical memory %'=92%;99;100
    [1] => 'physical memory'=29.69GB;31.68;32;0;32
)
  

Комментарии:

1. Это потрясающе, большое спасибо за объяснение и лучшее решение.

Ответ №2:

У PCRE reges нет глобального модификатора

Просто удалите /g модификатор из вашего регулярного выражения.

 $arr = preg_split("/x20(?=[^']*('[^']*'[^']*)*$)/", 
             "'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32");
  

Комментарии:

1. Вот и вся «совместимая с Perl» часть PCRE.