多行无效的preg_match_all

时间:2018-03-29 11:03:29

标签: php regex

我有一个字符串mystring,其中包含换行符:

when HTTP_REQUEST {
switch -glob [string tolower [HTTP::host]] {
    "sub1.sub.dom" {
    pool /networkname/hostname_80
    }
    "sub2.sub.dom" {
    pool /anothernetworkname/anotherhostname_80
    }
    default {
         drop 
    }
}
}

我正在尝试使用preg_match_all从该字符串中提取池,但我无法得到想要的结果......我目前正在使用:

preg_match_all('/\/([^"]+)$/m',$mystring,$result);

结果是:

Array
(
[0] => networkname/hostname_80
    }
[1] => anothernetworkname/anotherhostname_80
    }
    default {
         drop 
    }
}
})

我有两个问题:

  1. 为什么数组的第二个元素与第一个元素不相似?考虑到我使用相同的正则表达式这一事实?
  2. 我怎样才能获得没有括号和后面所有东西的池(正则表达式应该在一行的最后一位后停止匹配)。
  3. 感谢。

2 个答案:

答案 0 :(得分:2)

Wiktor正则表达式是正确的,但在空格.之后缺少\S,请参阅preg_match_all Demo

/\bpool\h+\K\S.+$/m

正则表达式解释:

  1. \ b在字边界处断言位置(^ \ w | \ w $ | \ W \ w | \ w \ W)池 字面匹配字符池(区分大小写)
  2. \ h +匹配任何水平空白字符(等于 [[:空白:]])
    • 量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
  3. \ K重置报告的匹配的起点。任何先前的 消费的字符不再包含在最终匹配中
  4. \ S匹配任何非空白字符(等于[^ \ r \ n \ t \ f \ v])
  5. 。+匹配任何字符(行终止符除外)
  6. 量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
  7. $断言行尾的位置
  8. 全局模式标记

    1. m修饰符:多行。导致^和$匹配开头/结尾 每一行(不仅是字符串的开头/结尾)

答案 1 :(得分:1)

您似乎只想在单词pool,1 +空格和/之后提取非空白字符块。

您可以使用

'~\bpool\h+/\K\S+$~m'

在PHP中使用preg_match_all函数。请参阅regex demo

<强>详情

  • \bpool - 整个单词pool(下一个字符应为水平空格,\b为单词边界)
  • \h+ - 1+水平空白字符
  • / - /字符
  • \K - 匹配重置运算符以丢弃目前为止匹配的文本
  • \S+ - 除了空白之外的1个字符
  • $ - 行尾(由于m修饰符)。

PHP demo

$re = '~\bpool\h+\K/\S+$~m';
$str = "when HTTP_REQUEST {\nswitch -glob [string tolower [HTTP::host]] {\n    \"sub1.sub.dom\" {\n    pool /networkname/hostname_80\n    }\n    \"sub2.sub.dom\" {\n    pool /anothernetworkname/anotherhostname_80\n    }\n    default {\n         drop \n    }\n}\n}";
if (preg_match_all($re, $str, $matches)) {
    print_r($matches[0]);
}

输出:

Array
(
    [0] => networkname/hostname_80
    [1] => anothernetworkname/anotherhostname_80
)