正则表达式检查新行

时间:2012-08-24 14:53:19

标签: php regex

我想检查if语句是在一行还是下一行没有像这样的括号:

if (blah === blah)
    do something

或:

if (foo === foo) do something

我目前正在使用的正则表达式

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

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

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

if (foo === bar)
{

5 个答案:

答案 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模式修饰符,以允许.匹配换行符。