Как исключить текст между двумя фигурными скобками с помощью регулярных выражений?

Я новичок в регулярных выражениях, у меня есть такой текст:

test {{это не должно быть выбрано и фигурные скобки тоже}}, но
этот {или} должен быть выбран. Поэтому я хочу исключить весь текст
между открывающей и закрывающей фигурными скобками.

и я хочу этот результат

«тестовое задание»

а также

«но этот {или} должен быть выбран. Поэтому я хочу исключить весь текст
между открывающими и закрывающими фигурными скобками. «

Это мое выражение, которое я использовал:

$p = '/[a-zA-Z0-9#\' ]+(?![^{{]*}})/';

Но это исключает одиночные фигурные скобки.
Я хочу знать, как включить одинарные фигурные скобки с текстом и исключить только текст между двумя фигурными скобками
И, пожалуйста, не могли бы вы дать мне хорошую документацию по выражению регулярных выражений? Я хочу узнать больше об этом.

2

Решение

Ввод (я удвоил строку для эффекта):

$string='test{{this should not be selected and the curly brackets too}} but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets. test{{this should not be selected and the curly brackets too}} but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets.';

Способ № 1 preg_split():

var_export(preg_split('/{{[^}]*}}/',$string,null,PREG_SPLIT_NO_EMPTY));
// Added the fourth param in case the input started/ended with a double curly substring.

Способ № 2 preg_match_all():

var_export(preg_match_all('/(?<=}{2}|^)(?!{{2}).*?(?={{2}|$)/s',$string,$out)?$out[0]:[]);

Вывод (в любом случае):

array (
0 => 'test',
1 => ' but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets. test',
2 => ' but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets.',
)

preg_split() обрабатывает двойные фигурные подстроки как «разделители» и разбивает на них полную строку.


preg_match_all() шаблон метода …
Образец Демо При этом используется положительный взгляд назад и положительный взгляд, оба из которых охотятся за двойными завитками или началом / концом строки. Он использует отрицательный прогноз в середине, чтобы избежать совпадения нежелательных двойных фигурных строк в начале новой строки. Наконец то s Модификатор в конце шаблона позволит . соответствовать символам новой строки.

1

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

(?:^|(?:}}))(.+?)(?:$|{{)

Попытайся: https://regex101.com/r/2Xy7gU/1/
Что здесь происходит:

  • (?:^|(?:}})) — начинается с начала строки или}}
  • (.+?) — соответствует всему (несвязно)
  • (?:$|{{) — матч должен
    заканчивается либо концом строки, либо {{

То, что вы хотите (без скобок) находится в первой группе.

1

использование preg_replace и заменить все вхождения \{\{[^\}]*\}\} с пустой строкой.

Пример: http://www.regextester.com/?fam=97777

Объяснение:

\{      - {
\{      - {
[^\}]*  - everything except }
\}      - }
\}      - }
0

2 варианта:

  • просто: просто рассмотрите блоки между {{}} как шаблон разделения
    $validblocks = preg_split("/{{[\w .]+}}/", $str);
  • сложный: используйте группы и сначала захватите отклоненный образец, тогда что остается:
    (?<novalid>{{[\w ]+}})|(?<valid>{|[\w .]*|})
    Управляй как хочешь потом. Пример здесь: https://regex101.com/r/SK729o/2
0
По вопросам рекламы [email protected]