복붙노트

bbcode를 파싱하는 가장 좋은 방법

PHP

bbcode를 파싱하는 가장 좋은 방법

나는 PHP 웹 사이트에 대한 bbcode 필터를 작업하고 싶습니다. (나는 cakephp를 사용하고있다, 그것은 bbcode 헬퍼가 될 것이다) 나는 몇 가지 요구 사항이있다.

Bbcodes는 중첩 될 수 있습니다. 그래서 그와 같은 것이 타당합니다.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Bbcodes는 0 개 이상의 매개 변수를 가질 수 있습니다.

예 :

[video: url="url", width="500", height="500"]Title[/video]

Bb 코드에는 여러 가지 동작이있을 수 있습니다.

예를 들어, [url] text [/ url]은 [url : url = "text"] text [/ url] 또는 영상 bbcode는 youtube, dailymotion 사이에서 선택할 수있을 것입니다 ....

나는 그것이 나의 필요의 대부분을 커버한다고 생각한다. 나는 algeay 정규식으로 뭔가를 완료했습니다. 하지만 가장 큰 문제는 매개 변수를 일치시키는 것이 었습니다. 사실, 0 개의 매개 변수로 작업하고 bbcode로 중첩 된 bbcode가 있습니다. 하지만 매개 변수에 대한 정규식 일치를 추가 할 때 중첩 된 bbcode가 올바르게 일치하지 않았습니다.

"\ [($ tag) (=. *) \"\] (. *) \ [\ / \ 1 \] "// 비 -

나는 지금 당장 나와 완전한 정규 표현식을 가지고 있지 않지만, 나는 (위)처럼 보이는 것을 가졌다.

그래서 bbcode를 정규식 또는 다른 것과 효율적으로 대응시키는 방법이 있습니다. 내가 생각할 수있는 유일한 방법은 방문객 패턴을 사용하여이 방법으로 각 가능한 태그로 텍스트를 분할하는 것입니다. 텍스트 파싱에 대한 제어권을 조금 더 가질 수 있으며 아마도 입력 텍스트가 유효하지 않은 경우 내 문서의 유효성을 검사 할 수 있습니다. 유효한 bbcode가 없습니다. 아무 것도 저장하기 전에 오류 메시지를 사용자에게 알릴 수 있습니다.

sablecc를 사용하여 텍스트 파서를 작성합니다. http://sablecc.org/

더 좋은 생각이야? 또는 효율적인 유연한 bbcode 파서로 이어질 수있는 모든 것?

고맙다. 그리고 나의 나쁜 영어에 대해 유감스럽게 생각한다. ..

해결법

  1. ==============================

    1.pecl과 PEAR BBCode 파싱 라이브러리가 있습니다. 소프트웨어는 수년간의 작업을 스스로 재발 명하지 않고도 충분히 어렵습니다.

    pecl과 PEAR BBCode 파싱 라이브러리가 있습니다. 소프트웨어는 수년간의 작업을 스스로 재발 명하지 않고도 충분히 어렵습니다.

    이들 중 어느 것도 옵션이 아니라면 BBCode를 유효한 XML 문자열로 변환 한 다음 원하는 XML 구문 분석 루틴을 사용하는 것에 집중할 것입니다. 아주 거친 생각은 여기에 있지만

    BBCode가 적절하게 중첩되어 있으면이 문자열을 XML 구문 분석 객체 (SimpleXML, DOMDocument 등)에 전달하도록 설정해야합니다.

  2. ==============================

    2.BBCode를 구문 분석하기위한 몇 가지 기존 라이브러리가 있습니다. 자신의 롤을 시도하는 것보다 해당 파일을 조사하는 것이 더 쉽습니다.

    BBCode를 구문 분석하기위한 몇 가지 기존 라이브러리가 있습니다. 자신의 롤을 시도하는 것보다 해당 파일을 조사하는 것이 더 쉽습니다.

    여기에 한 쌍, 나는 주변에 보는 경우에 더 많은 것이 확실하다 : PECL bbcode PEAR HTML_BBCodeParser

  3. ==============================

    3.bbcode 파서를 직접 살펴 보았습니다. 대부분은 정규식과 PHP4를 사용하고 PHP 5.2 이상에서 오류를 생성하거나 전혀 작동하지 않습니다. PECL bbcode 및 PEAR HTML_BBCodeParser는 더 이상 유지 보수되지 않아 (2012 년 후반), 함께 사용해야하는 공유 호스팅 설정에 쉽게 설치되지 않습니다. StringParser_BBCode는 5.2+에 약간의 비틀기가 있지만, 새로운 태그를 추가하는 방법은 어색하며, 2008 년에 마지막으로 업데이트되었습니다.

    bbcode 파서를 직접 살펴 보았습니다. 대부분은 정규식과 PHP4를 사용하고 PHP 5.2 이상에서 오류를 생성하거나 전혀 작동하지 않습니다. PECL bbcode 및 PEAR HTML_BBCodeParser는 더 이상 유지 보수되지 않아 (2012 년 후반), 함께 사용해야하는 공유 호스팅 설정에 쉽게 설치되지 않습니다. StringParser_BBCode는 5.2+에 약간의 비틀기가 있지만, 새로운 태그를 추가하는 방법은 어색하며, 2008 년에 마지막으로 업데이트되었습니다.

    빙 검색의 4 번째 페이지에 묻혔습니다 (절망적이었습니다) jBBCode가 새로 발견되어 PHP 5.3가 필요합니다. MIT Lisence. 아직 커스텀 태그를 만들지는 않았지만, 지금까지 PHP 5.3을 사용하는 공유 호스팅 계정에서 상자 밖에서 작동했던 것은 제가 시도한 유일한 것입니다.

  4. ==============================

    4.우리는 최근 bbcode 라우트를 살펴보고 대신 htmlpurifier를 사용하기로 결정했습니다. 이 결정은 htmlpurifier 그룹에 의해 여기에 나열된 다양한 메소드들과 bbcode (다시, htmlpurifer 그룹에 의한)의 논의 사이의 (아마도 편향된 아마) 비교에 부분적으로 기초를 두었습니다

    우리는 최근 bbcode 라우트를 살펴보고 대신 htmlpurifier를 사용하기로 결정했습니다. 이 결정은 htmlpurifier 그룹에 의해 여기에 나열된 다양한 메소드들과 bbcode (다시, htmlpurifer 그룹에 의한)의 논의 사이의 (아마도 편향된 아마) 비교에 부분적으로 기초를 두었습니다

    그리고 기록을 위해 나는 당신의 영어가 아주 좋다고 생각합니다. 나는 네가 모국어로 할 수있는 것보다 훨씬 낫다고 확신한다.

  5. ==============================

    5.PREG_DELIM_CAPTURE 플래그와 함께 preg_split ()을 사용하여 소스 코드를 태그 및 비 태그로 분리하십시오. 그런 다음 열려있는 블록의 스택을 유지하면서 태그를 반복합니다 (예 : 여는 태그를 볼 때 배열에 추가). 닫는 태그를 볼 때 닫기 태그가 여는 태그와 일치 할 때까지 배열의 끝에서 요소를 제거하십시오.

    PREG_DELIM_CAPTURE 플래그와 함께 preg_split ()을 사용하여 소스 코드를 태그 및 비 태그로 분리하십시오. 그런 다음 열려있는 블록의 스택을 유지하면서 태그를 반복합니다 (예 : 여는 태그를 볼 때 배열에 추가). 닫는 태그를 볼 때 닫기 태그가 여는 태그와 일치 할 때까지 배열의 끝에서 요소를 제거하십시오.

  6. from https://stackoverflow.com/questions/488963/best-way-to-parse-bbcode by cc-by-sa and MIT license