我想检查 if 语句是否在一行或下一行没有大括号,如下所示:
if (blah === blah)
do something
或者:
if (foo === foo) do something
我目前拥有的正则表达式是
/\)(?!.*\{)/
但不起作用。有人有想法么?
详细说明此正则表达式不会提取的唯一 If 语句如下:
if (foo === bar)
{
新行可能是\n
(UNIX)、\r\n
(Windows)、\r
(为了更好的衡量标准)。广泛匹配新行的表达式是:
/\r\n|\r|\n/
要检查表达式是否在一行,您可以这样做:
if( preg_match( '/\r\n|\r|\n/', $string ) ) {
// on more than one line
...
} else {
// on one line
...
}
为了进一步发展它以适用于您的特定语句示例if ... do
,您可以这样做:
if( preg_match( '/if *\([^\)]+\) *(\r\n|\r|\n) *do /', $string ) ) {
// on more than one line
...
} elseif( preg_match( '/if *\([^\)]+\) *do /', $string ) ) {
// on one line
...
}
简单 \r
\n
(回车和换行)
/[\r\n]/
您还需要.
匹配换行符:
/\)(?!.*\{)/s
^
PCRE_DOTALL Modifier
这是通过( ) 修饰符完成的s
PCRE_DOTALL
(如注释中所述):
s (PCRE_DOTALL)
如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,换行符被排除在外。这个修饰符等价于 Perl 的 /s 修饰符。诸如 [^a] 之类的否定类始终匹配换行符,与此修饰符的设置无关。
当你想专门检查这个时if
,使用这个:
(if[ ()\w=]+)\r\n
如果有换行符,则返回true ,否则返回false。if
您正在寻找不使用大括号的 if 语句,但您的模式需要大括号。
这是我的建议:(演示)
$strings = [
'if (blah === blah)
do something',
'if (foo === foo) do something',
'if (bah === bah) {
do something
}',
'if (bar === bar) {do something}'
];
foreach ($strings as $string) {
var_export(preg_match('~if\s*\(.*?\)\s*(\{)?~', $string, $m) ? $m : '');
echo "\nHas curly brace: " , isset($m[1]) ? 'Yes' : 'No';
echo "\n---\n";
}
输出:
array (
0 => 'if (blah === blah)
',
)
Has curly brace: No
---
array (
0 => 'if (foo === foo) ',
)
Has curly brace: No
---
array (
0 => 'if (bah === bah) {',
1 => '{',
)
Has curly brace: Yes
---
array (
0 => 'if (bar === bar) {',
1 => '{',
)
Has curly brace: Yes
---
基本上,用于\s*
表示标记中没有空格/换行符、空格/换行符、多个空格/换行符的位置。
我的模式不会捕获if
带有多行表达式的语句。为了适应这些边缘情况,请添加s
模式修饰符以允许.
匹配换行符。