2016-07-25 1 views
0

I는 다음과 같습니다 문자열이 : 난 그냥 "실험실 JL"jl.lab.test.net "를 추출하기 위해 노력하고있어바로 PHP는 정규식 정량을 얻이 수없는 것

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

을 실험실 JL-PPR-웹 "에서"-ppr : 실험실 JL-PPR-웹 "문자열"다음과 같은 정규 표현식을 사용

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

두 번째 그룹은 현재 전체 일치 ". 적절한 수량을 지정하려고했지만 지금까지 제대로 된 수량을 얻지 못했습니다. 나는 다음을 시도했다 :

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

내가 계속 놀고 있지만 팁이 있다면, 고맙겠습니다. 감사합니다. .

+0

몇 가지 예, 당신의 예상 최종 출력, 현재는 혼란하게 사용하는 문구를 포함하도록 질문을 업데이트하십시오. – cmorrissey

+0

'[]'는 하나의 문자와 일치하고'[] {3}'은 연속적으로 지정된 문자 3 개와 일치합니다. 그것은 3 문자의 3 ​​SETS와 일치하지 않을 것입니다. –

답변

1

왜 그냥

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

? -web을 캡처 그룹 외부에 그냥 두십시오.

0

그 하나가 합법적 인 것처럼 보이지만 나는 더 좋은 사람이 쓰여질 수 있다고 확신합니다. 여기

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

당신은 preg_match_all 기능으로

LiveRegex

0

사용에게 다음과 같은 접근 방식을 테스트 할 수 있습니다

$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 
) 
1

이것은 아마 당신이 정규식에서 찾고있는 것을 얻을 어렵다

'~"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 
관련 문제