Я новичок в регулярных выражениях, у меня есть такой текст:
test {{это не должно быть выбрано и фигурные скобки тоже}}, но
этот {или} должен быть выбран. Поэтому я хочу исключить весь текст
между открывающей и закрывающей фигурными скобками.
и я хочу этот результат
«тестовое задание»
а также
«но этот {или} должен быть выбран. Поэтому я хочу исключить весь текст
между открывающими и закрывающими фигурными скобками. «
Это мое выражение, которое я использовал:
$p = '/[a-zA-Z0-9#\' ]+(?![^{{]*}})/';
Но это исключает одиночные фигурные скобки.
Я хочу знать, как включить одинарные фигурные скобки с текстом и исключить только текст между двумя фигурными скобками
И, пожалуйста, не могли бы вы дать мне хорошую документацию по выражению регулярных выражений? Я хочу узнать больше об этом.
Ввод (я удвоил строку для эффекта):
$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
Модификатор в конце шаблона позволит .
соответствовать символам новой строки.
(?:^|(?:}}))(.+?)(?:$|{{)
Попытайся: https://regex101.com/r/2Xy7gU/1/
Что здесь происходит:
(?:^|(?:}}))
— начинается с начала строки или}} (.+?)
— соответствует всему (несвязно) (?:$|{{)
— матч долженТо, что вы хотите (без скобок) находится в первой группе.
использование preg_replace
и заменить все вхождения \{\{[^\}]*\}\}
с пустой строкой.
Пример: http://www.regextester.com/?fam=97777
Объяснение:
\{ - {
\{ - {
[^\}]* - everything except }
\} - }
\} - }
2 варианта:
$validblocks = preg_split("/{{[\w .]+}}/", $str);
(?<novalid>{{[\w ]+}})|(?<valid>{|[\w .]*|})