2015-01-16 3 views
0

에서 정규 표현식 나는 포함하는 문자열이이 (여기서 수는 사용자 ID를 나타내는 정수) 나는이 (가) 사용자 이름과 사용자 ID캡처 두 개의 문자열

\((.*?)\) 
을 얻기 위해 다음과 같은 필요가 생각

@[calbert](3) 
    @[username](684684) 

\[(.*?)]) 

그러나 한 번에 모두를 얻을 수있는 방법이

?

그리고 PHP는 반환이 가능에만 괄호없이 결과를 얻기 위해 (그리고 사용자 이름의 경우 괄호)

Array 
    (
[0] => (3) 
[1] => 3 
    ) 
입니다
+0

PHP 함수 ['으로, preg_match_all() '(http://php.net/manual/en/function.preg-match-all.php) 및 ['정규식 점검 'syntax] (http://php.net/manual/en/reference.pcre.pattern.syntax.php). – axiac

답변

0

긍정적 인 lookbehind 및 lookahead 어설 션을 통해.

  • (?<=\[)

    (?<=\[)[^\]]*(?=])|(?<=\()\d+(?=\)) 
    
  • [^\]]*

    는 문자와 일치하지만의 ] 0 번 이상, 경기가 [ 문자 덧붙일해야한다고 주장한다.

  • (?=]) 일치 내용 뒤에 ] 기호가 와야한다고 주장합니다.

  • | 2 개의 정규식을 결합하는 데 사용되는 논리 OR 연산자입니다.

DEMO

+0

문자열은 @ [leesfer] (3) (그)가 아니기 때문에 숫자 만 가져 오는 방법, "그"는 일치합니까 ?? – Callombert

+0

는'\ d +'를 사용합니다. 업데이트를 참조하십시오. –

3
\[([^\]]*)\]|\(([^)]*)\) 

본다는 demo.You이 | 또는 연산자를 사용할 필요가 시도 이것은 정규 표현식 엔진이 첫번째 캡처가 실패 할 경우 대체 그룹을 제공합니다.

$re = "/\\[([^\\]]*)\\]|\\(([^)]*)\\)/im"; 
$str = " @[calbert](3)\n @[username](684684)"; 

preg_match_all($re, $str, $matches); 

https://regex101.com/r/tX2bH4/31

또는 당신은 UR 자신의 정규식을 사용할 수 있습니다. \((.*?)\)|\[(.*?)\])

관련 문제