2012-08-07 5 views
0

내 앱에 a-facebook과 유사한 언급 기능이 있습니다.모두 일치하는 PHP 정규식 패턴

게시물이나 댓글을 작성할 때 사용자는 @ 기호로 다른 사용자를 언급 할 수 있습니다. 나는 다음을 사용 jQuery 플러그인 : http://podio.github.com/jquery-mentions-input/

는 다음과 같은 형식으로 생성됩니다 언급 : @@ [마르코 Kurjonen : 2] 그래서 "@@ [사용자 이름 : USER_ID]

현재 나는 다음과 같은 한 패턴 (코드) :.

$pattern = "/@@\[(.*):(\d*)] /ims"; 

$matches = array(); 
preg_match_all($pattern, $input, $matches); 
Zend_Debug::dump($matches); 
$output = preg_replace($pattern, "<a href=\"". $this->view->baseUrl("user") ."/$2\" class=\"tooltip\">$1</a>", $input); 

문제는 그것이 첫 번째 언급 않는다는 것입니다

예 문자열 :

$input = "Hello @@[Markku Pelkonen:7] and @@[Marko Kurjonen:2]" 

preg_replace로 첫 번째 사용자 만 변환됩니다. 당신이 정규식을 사용할 수 있습니다

BR, 마르코

답변

2

는 :

/@@\[([^:]*):(\d*)\]/ 

이 정규식 이름 : 문자를 포함하지 않는 것으로 가정합니다. 그 입력의 마지막이기 때문에, 단부

  • 공간, ]가 일치하지 두 번째 언급 발생 직후 :

    원래 정규식 2 문제점이있다. (당신이 그것을 제거하면 욕심 정량는 전체 입력 문자열을 중얼됩니다.)

  • *(.*)에 일치하는 0 개 이상의 인스턴스 탐욕, 그것은 다음 토큰까지 가능한 한 많은 문자와 일치합니다 의미 일치 할 수 없으며, 다음 토큰과 역 추적하여 일치 시키려고합니다. 위에서 언급 한 것처럼 공간을 제거하면 전체 입력 문자열이 위로 올라와있는 것입니다.

(내가 위에서 언급 한 용액으로부터 분리) 작업을 확인하기 위해 정규식 조금 수정하는 것도 가능합니다 :

/@@\[(.*?):(\d*)]/s 

m 플래그와 i 플래그는 여기에 쓸모없는, 그래서 제거 그들. 정규식에서 ^ 또는 $을 사용하지 않으므로 m 플래그는 쓸모가 없습니다. i 플래그는 여기에 해당하지 않는 정규 표현식에 문자가있는 경우에만 유용합니다.

여기에 *? 한정 기호를 사용합니다.이 숫자 한정자는 0 번 이상 일치하는 게으른 버전입니다. 매치 될 다음 토큰에 대해 가능한 한 적은 수의 문자와 일치합니다.

+0

대괄호는 전체 태그 내용을 정의하는 것이기 때문에'[^ :] '대신'[^ \]]을 사용하고': (\ d *)'를 발견 할 수 있기 때문에 사용자 이름에서':'이됩니다. – Backlin

+0

@Backlin : 사용자 이름 형식이 확실하지 않습니다. ']'이 사용자 이름에 있다면, 나는 혼동을 해결하기 위해 OP가 무엇을 할 것인지 모른다. – nhahtdh

+0

네 말이 맞아.'[^ :]'을 사용하면 사용자 이름에 콜론을 사용할 수 없으며 '[^ \]]을 사용하면 닫는 괄호를 사용할 수 없습니다. 그러나 나는 이런 캐릭터를 피하기 위해 그 캐릭터 중 어느 것도 허용해서는 안된다고 생각한다. – Backlin