2015-01-28 2 views
1

태그 사이에 기타 텍스트가 포함 된 초기 문자열이 있고 문자열에 중첩 태그가 포함될 수 있습니다. 다음 규칙에 따라 문자열을 "비틀어 넣기"를 원합니다. 1) 최종 문자열 은 일부 태그를 추가하거나 삭제하는 것을 제외하고는 초기 문자열과 다릅니다. 2) 마지막 문자열에서 모든 텍스트는 가장 가까운 쌍의 태그로 묶여 원래 문자열로 묶습니다. 페어가 거의 비슷하게 여러 개있는 경우 결과는 지정되지 않습니다 (그러나 3) 텍스트의 일부는 최종 문자열에 새 태그가 할당됩니다. PHP에서 PCRE regexp를 사용하여 태그를 denest 할 수 있습니까?

[a]text1[/a]text2[b]text3[c]text4[/c]text5[/b] 
[e]text6[f]text7[/e]text8[/f] 

이가되어야

따라서

,

text7, [e]text7[/e] 또는 [f]text7[/f]의 수 있습니다
[a]text1[/a]text2[b]text3[/b][c]text4[/c][b]text5[/b] 
[e]text6[/e]...[f]text8[/f] 

.

이 작업을 수행하는 regexp (예 : PHP의 재귀 PCRE regexp)가 있습니까?

+1

아마 모든 엣지 케이스를 처리하는 것은 아닙니다. 파서를 구현해야합니다. –

+0

@self는 PHP에 특정 파서 도구가 있습니까? 아니면 단순히 preg_split과 문자열 함수를 처음부터 사용합니까? –

+0

잘 파싱하는 것은 큰 문제입니다. 재귀 파서 파서가 무엇인지 찾아 봅니다. –

답변

0

방법

3 대체 실행하여 다른 종료 태그 다음에 폐쇄 태그

  1. 검색 ==> 제위한 개구 태그를 삽입한다. 예 :

    가 단지 ==> 종료 태그를 삽입 한 발견에 대응 종료 태그가 아닌 태그이어서 개구 태그
    [/b]text[/c]  ==> [/b][c]text[/c] 
    
  2. 검색. 예 :

    [a]text[b]  ==> [a]text[/a][b] 
    [a]text[/b]  ==> [a]text[/a][/b] 
    
  3. (2 수정 프로그램). 연속 된 2 개의 닫는 태그 검색 ==> 두 번째 태그 제거. 예 :

    [a]text[/a][/b] ==> [a]text[/a] 
    

코드

$patterns = array ('#(\[/\w++])([^[]++\[/(\w++)])#', 
        '#\[(\w++)][^[]*+(?!\[/\1)#', 
        '#(\[/(\w++)])\[/\w++]#'); 
$replace = array ('\1[\3]\2', 
        '\0[/\1]', 
        '\1'); 

$string = "[a]text1[/a]text2[b]text3[c]text4[/c]text5[/b]\n[e]text6[f]text7[/e]text8[/f]"; 

$result = preg_replace($patterns, $replace, $string); 

출력

[a]text1[/a]text2[b]text3[/b][c]text4[/c][b]text5[/b] 
[e]text6[/e][f]text7[/f][f]text8[/f] 
관련 문제