我想检查if语句是在一行还是下一行没有像这样的括号:
if (blah === blah)
do something
或:
if (foo === foo) do something
我目前正在使用的正则表达式
/\)(?!.*\{)/
但不起作用。有人有什么想法吗?
详细说明此正则表达式不会提取的唯一If语句如下:
if (foo === bar)
{
答案 0 :(得分:6)
简单\r
\n
(回车和换行)
/[\r\n]/
答案 1 :(得分:2)
新行可能是\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
...
}
答案 2 :(得分:2)
您还需要.
匹配换行符:
/\)(?!.*\{)/s
^
PCRE_DOTALL Modifier
这是通过the s
(PCRE_DOTALL
) modifier完成的(如评论中所述):
s(PCRE_DOTALL)
如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,排除了换行符。此修饰符等效于Perl的/ s修饰符。诸如[^ a]之类的否定类始终匹配换行符,与此修饰符的设置无关。
答案 3 :(得分:0)
如果您想专门针对if
进行检查,请使用:
(if[ ()\w=]+)\r\n
如果if
有换行符,则返回 true ,否则返回 false 。
答案 4 :(得分:0)
您正在寻找if语句不使用大括号,但您的模式需要大括号。
这是我的建议:(Demo)
$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
模式修饰符,以允许.
匹配换行符。