2011-08-31 2 views
0

BBCode와 같은 html 파서를 만들려고합니다. 나는 다음과 같은 형식으로 HTML 텍스트에서 항목을 구문 분석 할 예를 들어 : .....html..... [I]Item1[/I].....html....[I]Item2[/I]......
그래서 나는 [I]XXXXX[/I]가 나는 또한 정규식 str_replace을 방지하기 위해 전용 항목 1을 반환하려면 얻을 수있는 정규 표현식을 사용하고 . 현재 str_replace [I]""[/I]""으로 사용하여 Item1을 얻습니다. 문제는 정규식이 항상 작동하지 않는다는 것입니다.정규 표현식의 PHP 하위 문자열이 일치하고 정규 표현식이 항상 작동하지 않는 경우

$pattern="/\[I]([^\[].)+\[\/I]/m"; 
preg_match_all($pattern,$string,$out,PREG_SET_ORDER); 
foreach($out as $i) 
{ 
    $temp=$i[0]; 
    echo "Found!"; 
    $i[0]=str_replace("[I]","",$i[0]); 
    $i[0]=str_replace("[/I]","",$i[0]); 
    ...... 
} 

내 정규 표현식의 의미 :
나는 울부 짖는 코드를 사용하고 [I]이 ([I] [I] [/I] [/I]을 방지하기 위해) [를 제외한 모든 문자와 계속 [/I]로 끝과 시작합니다. aaaaa과 같은 일부 문자열이 있고 aaa aa 같은 문자열이 있습니다. 어쩌면 그런 HTML 파서를 만드는 더 좋은 방법이 있을까요?
감사합니다.

편집 : 좋아, 해결책을 찾았지만 왜 이것이 작동하지 않는지 이해할 수 없습니다! 해결책은 $pattern='#\[i\](.*?)\[/i\]#is' 이었지만 그 차이점은 무엇입니까?

편집 2 : 레이더가 주 문제가 정확했습니다. ([^\[.)+]입니다. 그러면 언어 [I](a)^2n[/I]이 생성되어 [I]aa[/I]과 일치하지만 [I]aaaaa[/I]은 일치하지 않습니다!

답변

1

나는 당신의 서브 패턴 ([^\[].)+ 문제라고 생각합니다. 시도 ([^\[]+)

+0

흠 ... 당신이 올바른지 내가 실수로 lanquage [I] (AA)^창조 N [/ I]! – nikosdi

1

이 같은 것을 사용해보십시오 :

$parsed_str = '[I]Item1[/I].....html....[I]Item2[/I].....'; 
preg_match_all('~\[I\]([^\[.]+?)\[\/I\]~i', $parsed_str, $result); 
print_r($result[1]); 

같은 결과는 다음과 같이 주어진다 :

preg_match_all('~\[I\]([^\[].+?)\[\/I\]~i', $parsed_str, $result); 
1

당신의 문제는

$temp=$i[0]; 

인덱스 0 전체 일치 패턴을 포함 일치한다. 대신 인덱스 1을 사용합니다 - 정규 표현식의 첫 번째 괄호에 부분 :

$temp = $i[1] 
관련 문제