8

我想检查 if 语句是否在一行或下一行没有大括号,如下所示:

if (blah === blah)
    do something

或者:

if (foo === foo) do something

我目前拥有的正则表达式是

/\)(?!.*\{)/

但不起作用。有人有想法么?

详细说明此正则表达式不会提取的唯一 If 语句如下:

if (foo === bar)
{
4

5 回答 5

8

新行可能是\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
   ...
}
于 2012-08-24T14:58:03.407 回答
8

简单 \r \n(回车和换行)

/[\r\n]/
于 2012-08-24T14:55:43.033 回答
2

您还需要.匹配换行符:

/\)(?!.*\{)/s
            ^
    PCRE_DOTALL Modifier

这是通过( ) 修饰符完成sPCRE_DOTALL(如注释中所述):

s (PCRE_DOTALL)

如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,换行符被排除在外。这个修饰符等价于 Perl 的 /s 修饰符。诸如 [^a] 之类的否定类始终匹配换行符,与此修饰符的设置无关。

于 2012-08-24T15:06:02.117 回答
0

当你想专门检查这个时if,使用这个:

(if[ ()\w=]+)\r\n

如果有换行符,则返回true ,否则返回falseif

于 2012-08-24T15:01:09.757 回答
0

您正在寻找不使用大括号的 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模式修饰符以允许.匹配换行符。

于 2019-07-23T21:40:48.823 回答