regex — PHP взрывает строку, но обрабатывает слова в кавычках как одно слово и игнорирует скобки

Я использую решение от 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
)

)

Я могу достичь вышеуказанного результата, если я добавлю пробел после ‘(‘ и до ‘)’.

Пожалуйста, посоветуйте правильное выражение регулярного выражения, которое позволило бы мне держать скобки отдельно (с объяснениями, если это возможно).

Спасибо.

1

Решение

Причина в том, что используемое вами регулярное выражение предназначено для " в матчах.

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

'/"(?:\\\\.|[^\\\\"])*"|[^\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' )
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector