php preg_split разделить строку на массив из квадратных скобок - PullRequest
2 голосов
/ 04 апреля 2019

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

$value = "<p>&nbsp;Lorem ipsum dolor [State] sit amet, consectetur [City] adipisicing [TopJob7] elit, sed do eiusmod [JobType]</p>";

$tagsReplace = preg_split('/[\[]*[\][]/U', $value, -1);

echo '<pre>';
print_r( $tagsReplace );
exit;

Когда я запускаю приведенный выше код, я получаю вывод как

Array
(
    [0] => <p>&nbsp;Lorem ipsum dolor 
    [1] => State
    [2] =>  sit amet, consectetur 
    [3] => City
    [4] =>  adipisicing 
    [5] => TopJob7
    [6] =>  elit, sed do eiusmod 
    [7] => JobType
    [8] => </p>
)

Я хочу вывод, как показано ниже.

Array
(
    [0] => <p>&nbsp;Lorem ipsum dolor 
    [1] => [State]
    [2] =>  sit amet, consectetur 
    [3] => [City]
    [4] =>  adipisicing 
    [5] => [TopJob7]
    [6] =>  elit, sed do eiusmod 
    [7] => [JobType]
    [8] => </p>
)

Пожалуйста, помогите мне, где я сделал ошибку.

1 Ответ

3 голосов
/ 04 апреля 2019

Ваш шаблон [\[]*[\][] соответствует 0+ раз открывающей скобке, а затем либо открывающей или закрывающей скобке, давая вам либо [, либо n ]

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

Используйте флаг PREG_SPLIT_DELIM_CAPTURE, чтобы оставить разделитель.

Обратите внимание, что вам не нужен флаг /U.

(\[[^]]+\])

Пояснение

  • ( Группа захвата
    • \[ Матч [
    • [^]]+ Матч 1+ раз не ]
    • \] Матч ]
  • ) Закрыть группу

Regex demo | Php demo

Например:

$value = "<p>&nbsp;Lorem ipsum dolor [State] sit amet, consectetur [City] adipisicing [TopJob7] elit, sed do eiusmod [JobType]</p>";
$tagsReplace = preg_split('/(\[[^]]+\])/', $value, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r( $tagsReplace );
...