preg_match_all多行匹配失效,如何提取iRule字符串中的Pool路径?
解决多行字符串中提取F5 Pool路径的正则问题
你的问题出在原正则的匹配范围没有精准限定,导致把行尾的无关字符也包含进去了。咱们一步步来修正:
原正则的问题分析
你用的/\/([^"]+)$/m存在两个核心问题:
[^"]+会匹配除双引号外的所有字符,包括空格和},所以会把networkname/hostname_80 }这类带后缀的内容都捞进来;- 没有限定匹配的上下文(比如只匹配
pool关键字后面的路径),容易误匹配字符串中其他无关的斜杠内容。
修正后的正则方案
更精准的做法是基于pool关键字来定位目标路径,用这个正则:
preg_match_all('/pool\s+(\/[^}\s]+)/', $mystring, $result);
正则各部分解释:
pool\s+:精准匹配pool关键词,以及后面跟着的一个或多个空白字符(空格、制表符都能覆盖);(\/[^}\s]+):捕获组,匹配以/开头的路径,直到遇到}或空白字符为止——刚好截断到Pool路径的结尾,不会包含后面的}。
完整代码示例
$mystring = <<<'EOF' 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 } } } EOF; preg_match_all('/pool\s+(\/[^}\s]+)/', $mystring, $result); print_r($result[1]);
输出结果
Array ( [0] => /networkname/hostname_80 [1] => /anothernetworkname/anotherhostname_80 )
这样就完美提取到了你需要的Pool路径啦~
内容的提问来源于stack exchange,提问作者RidRoid
相关产品推荐
相关产品推荐

