#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.