2013-05-01 2 views
0
<?php 
$data='123 
[test=abc]cba[/test] 
321'; 
$test = preg_replace("(\[test=(.+?)\](.+?)\[\/test\])is","$1",$data); 
echo $test; 
?> 

에 예기치 않은 결과를 반환 abc 있지만 123 abc 321 을 반환하는 대신 abc을 반환하는 내가 잘못 뭐하는 거지 알려주세요.

+0

캡쳐 그룹이 두 개이고 세 번째 그룹이 '$ 0'이므로 '$ 2'(으)로 변경하면됩니까? – HamZa

답변

1

일치하는 부품 (BBcode 섹션) 만 교체하고 있습니다. 나머지 문자열은 그대로 둡니다.

당신은 또한 선행/후행 문자를 제거하려면

, 표현의 것들을 포함한다 :

$test = preg_replace("(.*\[test=(.+?)\](.+?)\[\/test\].*)is","$1",$data); 
+0

고마워요. 저는 정규 표현식이 좋지 않아서 많은 도움을 받았습니다. – user1670459

0

당신은 여기로 교체를 사용할 필요가 없습니다, 당신이 필요로하는 모든 것은 뭔가을하는 것입니다 끈. 당신이 알고 있다면 나도 몰라

$data='123 
[test=abc]cba[/test] 
321'; 
$test = preg_match('~\[test=\K[^\]]++~', $data, $match); 
echo $match[0]; 
1

하지만 정규식에서 괄호의 가장 바깥 쪽 세트는 그룹 (캡처 또는 기타)를 형성하지 않습니다 그는 preg_match을하는 것은 더 유용합니다. PHP는 이것을 regex delimiters으로 해석합니다. 이며이를 구분 기호로 사용하고 있으므로 사용하지 마십시오. regexes (~, %, @ 등)에서 결코 특별한 의미가없는 대괄호로 묶지 않는 문자를 사용하는 것이 가장 좋습니다.

Casimir에 동의합니다. preg_match()preg_replace()이 아니라 사용하는 도구입니다. 그러나 그의 해결책은 필요 이상으로 까다 롭습니다. 귀하의 원래 정규식 잘 작동;

if (preg_match('%\[test=(.+?)\](.+?)\[/test\]%si', $data, $match)) { 
    $test = $match[1]; 
} 
관련 문제