2012-11-16 3 views
1

어떻게 패턴 일치를 계산 한 다음 패턴을 개수로 대체할까요?패턴 일치 및 PHP의 카운트로 대체

일치하는 모든 패턴은 문자열의 bbcode 스타일 태그입니다.

예 : 모든 단어가 [파랑] 색 [/ 파랑] 인 [파랑] 텍스트 [/ 파랑]의 단락입니다.

나는이 발생할 때처럼 숫자와 추가 텍스트로 를 각 태그를 교체해야 [@@ 1 @@] 및 [@@ 2 @@]

내가는 preg_match와 패턴을 일치시킬 수 있습니다 알고 ('/[blue](.*?)[blue]/i',$string) 또는 심지어 preg_replace를 대체하십시오.

하지만 어떻게 이러한 함수 중 하나를 사용하여 카운트를 얻고 일치 항목을 그것의 계산 위치?

+0

에 대한 추가 정보를 원하시면 manual 참조 "카운트"당신은 당신이 각각의 교체에 반복자를 포함 할 것을 의미합니까, 나를 혼란? 예를 들어'hello [blue] some [/ blue] [blue] text [/ blue]'는'hello [replaced_blue1] some [/ replaced_blue1] [replaced_blue2] text [/ replaced_blue2]'가됩니까? – nyson

+0

네 맞습니다! – Blade

+0

정규 표현식으로는 불가능하지는 않더라도 어렵다고 생각합니다. 내가 너라면, [preg_match()] (http://php.net/manual/en/function.preg-match.php)에 대한 PREG_OFFSET_CAPTURE 플래그를 확인하여 위치를 얻은 다음 분할하고 연결합니다. 그것에 따라 문자열이 일치합니다. 나는 내일까지 바쁘다. 그러나 나는 당신에게 개념 증명을 줄 수있다. – nyson

답변

1

$ matches 매개 변수를 사용할 수 있습니다. 당신이 $matches 통과하면

int preg_match (string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]]) 

는 모든 결과 배열을 반환합니다. 카운트를 반환하려면 count($matches)을 사용하십시오!

EDIT : $ matches 배열을 얻은 후에 배열의 키를 카운트 값으로 사용하여 대체 할 수 있습니다.

foreach($matches as $k=>$mat){ 
preg_replace (/*same pattern*/,"[@@".$k."@@]", /* same subject */,1); //fourth param is to replace only one! 
} 

시도해보십시오!

EDIT2 : correct는 preg_match가 아닌 preg_match입니다 (내 EDIT에서).

+0

그는 전체 경기 수를 묻지 않고 각 교체에서 사용할 증분 값을 요구했습니다. – nyson

+0

필자가 필요로하는 $ matches를 사용하는 방법, Blade를 편집합니다. – JDuarteDJ

+1

감사합니다 JDuarteDJ 나는 다른 일들이 내 코드에서 진행되기 때문에 당신의 솔루션을 정확하게 사용하지 못했지만 당신의 솔루션은 다르게 생각하고 내 문제를 해결하도록 이끌었습니다. 그러나 당신의 솔루션 [편집 2]이 제가 제안한 상황에서 효과가 있다는 것을 알 수 있습니다. 불행히도 아직 투표 할 수는 없지만 (그러나 감사합니다.) – Blade

1

해보십시오 preg_replace_callback :

$result = preg_replace_callback('/(\[blue\])([\[]*)(\[\/blue\])/i', function ($matches) { 
    static $incr = 0; 
    ++$incr; 
    return '[@@'.$incr.'@@]'.$matches[2].'[@@'.$incr.'@@]'; 
}, $text); 

+0

흥미로운 기능, 그 중 하나에 대해 몰랐습니다. 도움을 주셔서 감사합니다! – Blade