Я использую решение от 2202435. Но когда я добавляю скобки к строке, это не дает правильного результата в массиве.
$text = 'Lorem ipsum ("dolor sit amet") consectetur "adipiscing \\"elit" dolor';
preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches);
print_r($matches);
Приведенный выше код производит
Array
(
[0] => Array
(
[0] => Lorem
[1] => ipsum
[2] => ("dolor
[3] => sit
[4] => amet")
[5] => consectetur
[6] => "adipiscing \"elit"[7] => dolor
)
)
Но результат, который я ищу,
Array
(
[0] => Array
(
[0] => Lorem
[1] => ipsum
[2] => (
[3] => "dolor sit amet"[4] => )
[5] => consectetur
[6] => "adipiscing \"elit"[7] => dolor
)
)
Я могу достичь вышеуказанного результата, если я добавлю пробел после ‘(‘ и до ‘)’.
Пожалуйста, посоветуйте правильное выражение регулярного выражения, которое позволило бы мне держать скобки отдельно (с объяснениями, если это возможно).
Спасибо.
Причина в том, что используемое вами регулярное выражение предназначено для "
в матчах.
Если вы уверены, что двойные кавычки без экранирования всегда соединены во входных данных, используйте
'/"(?:\\\\.|[^\\\\"])*"|[^\s"]+/'
^^^^^^
Исключить "
от \S
превратив его в класс отрицательных персонажей [^\s]
и добавьте двойную кавычку внутрь.
Чтобы включить подстроки в одинарных кавычках, вы можете использовать
'~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~'
Увидеть regex demo и PHP демо:
$re = '~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~';
$str = 'Lorem ipsum ("dolor sit amet") consectetur "adipiscing \\"elit" dolor \'something \\\'here\'';
preg_match_all($re, $str, $matches);
print_r($matches[0]);
// => Array ( [0] => Lorem [1] => ipsum [2] => ( [3] => "dolor sit amet" [4] => )
// [5] => consectetur [6] => "adipiscing \"elit" [7] => dolor [8] => 'something \'here' )
Других решений пока нет …