Warning: file_put_contents(/datas/wwwroot/jiajiahui/core/caches/caches_template/2/default/show.php): failed to open stream: Permission denied in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 55

Warning: chmod(): Operation not permitted in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 56
似乎无法得到正确的PHP正则表达式量词 - 源码之家

似乎无法得到正确的PHP正则表达式量词

问题描述:

我有一个字符串,它看起来像这样:似乎无法得到正确的PHP正则表达式量词

msg": "log domain jl.lab.test.net server lab-jl-ppr-web" 

我试图提取“jl.lab.test.net”,公正“的实验室-JL -ppr”,从 “实验室JL-PPR-网” 使用以下正则表达式:

preg_match("/\"msg\"\: \"log domain\s([\w*\.]*) server ([\w*\.\-]*)/i",$line,$matches); 

第二组当前匹配的整个 “实验室JL-PPR-网” 的字符串。我一直在试图说明适当的量词,但到目前为止我还没有得到正确的量词。我试过以下内容:

preg_match("/\"msg\"\: \"log domain\s([\w*\.]*) server ([\w*\.\-]*){3}/i",$line,$matches); 

我继续玩它,但如果你有任何提示,我会很感激。 谢谢。

+0

请更新您的问题,包括了几个例子,和你预期的最终输出,是您目前使用使得混乱的措辞。 – cmorrissey

+0

'[]'匹配单个字符,'[] {3}'匹配连续3个指定字符。它不会匹配3个字符的3个组。 –

为什么不

/..snip.. server ([\w*\.\-]*)-web/i 

?只要保留-web以外的捕获组。

这似乎是合法的,但我确信可以写得更好。

^log domain ([a-zA-Z\.]+) server ([a-zA-Z\.\-]+)-web$ 

在这里你可以preg_match_all功能测试

LiveRegex

用下面的办法:

$str = "log domain jl.lab.test.net server lab-jl-ppr-web"; 
preg_match_all("/\b\w+\.\w+\.\w+\.\w+\b|\b\w+-\w+-\w+(?=-\w+?)\b/U", $str, $matches); 

print_r($matches[0]); 

输出:

Array 
(
    [0] => jl.lab.test.net 
    [1] => lab-jl-ppr 
) 

这可能适用

'~"msg":[ ]"log[ ]domain\s([\w.]*)[ ]server[ ]((?:(?!-web)[\w.-])*)~' 

但是,很难从正则表达式中找到你要找的东西。

扩展

"msg": [ ] "log [ ] domain \s 
([\w.]*)     # (1) 
[ ] server [ ] 
(       # (2 start) 
     (?: 
      (?! -web) 
      [\w.-] 
    )* 
)        # (2 end) 

输出

** Grp 0 - (pos 0 , len 52) 
"msg": "log domain jl.lab.test.net server lab-jl-ppr 
** Grp 1 - (pos 19 , len 15) 
jl.lab.test.net 
** Grp 2 - (pos 42 , len 10) 
lab-jl-ppr