我是正则表达式的新手,我有这样的文字:
测试{{这不应该被选中,大括号也是}}但是 应该选择这个{或}。所以我想排除所有文字 在开始和结束的花括号之间。
我想要这个结果
"测试"
和
"但应选择此{或}。所以我想排除所有文字 在开始和结束的花括号之间。"
这是我用过的表达方式:
$p = '/[a-zA-Z0-9#\' ]+(?![^{{]*}})/';
但这不包括单个花括号 我想知道如何在文本中包含单个花括号,并且只在两个花括号之间排除文本 请你能给我一些关于正则表达式的好文档吗?我想了解更多相关信息。
答案 0 :(得分:1)
(?:^|(?:}}))(.+?)(?:$|{{)
试一试:https://regex101.com/r/2Xy7gU/1/
这里发生了什么:
(?:^|(?:}}))
- 以字符串的开头或}} (.+?)
- 匹配所有内容(ungreedy)(?:$|{{)
- 匹配必须
以字符串的两端结尾或{{你想要的(没有括号)在第一组。
答案 1 :(得分:1)
输入(我将字符串加倍以实现效果):
$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()
方法模式......
.closest()
这使用了一个积极的外观和一个积极的前瞻,两者都寻找双重曲线或者弦的开始/结束。它在中间使用负前瞻,以避免在新行的开头匹配不需要的双卷曲字符串。最后,模式末尾的s
修饰符将允许.
匹配换行符。
答案 2 :(得分:0)
使用\{\{[^\}]*\}\}
并将所有出现的\{ - {
\{ - {
[^\}]* - everything except }
\} - }
\} - }
替换为空字符串。
示例:http://www.regextester.com/?fam=97777
说明:
require
答案 3 :(得分:0)
2个选项:
$validblocks = preg_split("/{{[\w .]+}}/", $str);
(?<novalid>{{[\w ]+}})|(?<valid>{|[\w .]*|})