PHP preg_split фигурные скобки

Кто может мне помочь? У меня есть такая строка:

$string = '<p>{titleInformation}<p>';

Я хочу разбить эту строку, чтобы получить следующий массив:

array ( 
  0 => '<p>',
  1 => '{titleInformation}', 
  2 => '<p>',
)

Я новичок в регулярных выражениях, и я пробовал несколько шаблонов с функцией preg_match_all(), но не могу найти правильный. Также просмотрел этот вопрос PHP preg_split, если он не находится внутри фигурных скобок, но в моей строке нет пробелов.

Заранее спасибо.


person R. Haamke    schedule 18.11.2017    source источник
comment
Нужно ли это решать с помощью регулярных выражений? Это тривиальная задача, например. DOMDocument.   -  person Álvaro González    schedule 18.11.2017
comment
Почему <p> вместо </p> в качестве закрывающего тега?   -  person nice_dev    schedule 18.11.2017


Ответы (3)


Используйте preg_match() с группами захвата. Вам нужно избегать фигурных скобок, потому что они имеют особое значение в регулярных выражениях.

preg_match('/(.*?)(\\{[^}]*\\})(.*)/', $string, $match);
var_dump($match);

Результат:

array(4) {
  [0]=>
  string(24) "<p>{titleInformation}<p>"
  [1]=>
  string(3) "<p>"
  [2]=>
  string(18) "{titleInformation}"
  [3]=>
  string(3) "<p>"
}

$match[0] содержит совпадение для всего регулярного выражения, элементы 1-3 содержат нужные вам части.

person Barmar    schedule 18.11.2017

На мой взгляд, лучшая функция для вашей задачи: preg_split(). Он имеет flag с именем PREG_SPLIT_DELIM_CAPTURE, который позволяет вам сохранить выбранный вами разделитель в выходном массиве. Это очень простая техника, и использование negated character classes ([^}]*) — отличный способ ускорить ваш код. Дополнительные преимущества использования preg_split() по сравнению с preg_match() включают:

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

Код: (демонстрация PHP) (Демонстрация шаблона)

$string = '<p>{titleInformation}<p>';
var_export(
    preg_split('/({[^}]*})/', $string, 0, PREG_SPLIT_DELIM_CAPTURE)
);

Выход:

array (
  0 => '<p>',
  1 => '{titleInformation}',
  2 => '<p>',
)

Если этот ответ не работает для всех ваших вариантов использования, отредактируйте свой вопрос, включив в него образцы строк ввода, и отправьте мне ping-я обновлю свой ответ.

person mickmackusa    schedule 23.11.2017

С preg_split это можно сделать так

preg_split('/[{}]+/', $myString);
person Shahzaib Hayat Khan    schedule 11.01.2019