문제

PHP 웹 사이트의 BBCode 필터에서 작업하고 싶습니다. (저는 CakePHP를 사용하고 있습니다. BBCode 도우미가 될 것입니다) 몇 가지 요구 사항이 있습니다.

BBCodes는 중첩 될 수 있습니다. 그래서 그런 것이 유효합니다.

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

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

예상 :

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

bbcodes에는 뮤 타프 행동이있을 수 있습니다.

말하겠습니다. [url]text[/url] 변형 될 것입니다 [url:url="text"]text[/url]또는 비디오 BBCode는 YouTube, Dailymotion 중에서 선택할 수 있습니다 ....

나는 그것이 내 요구의 대부분을 다루고 있다고 생각합니다. 나는 alreay가 Regex와 함께 무언가를했다. 그러나 나의 가장 큰 문제는 매개 변수와 일치하는 것이 었습니다. 실제로, 나는 중첩 된 BBCode가 작동하고 BBCode가 0 매개 변수로 얻었습니다. 그러나 매개 변수에 대한 REGEX 일치를 추가하면 중첩 된 BBCode와 올바르게 일치하지 않았습니다.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // 그렇지 않았습니다.* 그러나 비 그리드 경기자

나는 지금 나와 함께 완전한 동정인이 없지만 (위)처럼 보이는 무언가가있었습니다.

BBCode를 Regex 또는 다른 것과 효율적으로 일치시키는 방법이 있습니다. 내가 생각할 수있는 유일한 것은 방문자 패턴을 사용하고 가능한 각 태그로 텍스트를 분할하는 것입니다. 텍스트 구문 분석을 조금 더 제어 할 수 있으며 입력 텍스트가 Doingn 이하는 경우 문서를 검증 할 수 있습니다. 't는 유효한 bbcode를 가지고 있습니다. 저장하기 전에 사용자에게 오류를 알릴 수있었습니다.

SABLECC를 사용하여 텍스트 파서를 만들 것입니다.http://sablecc.org/

더 나은 아이디어가 있습니까? 또는 효율적인 유연한 BBCode 파서로 이어질 수있는 것이 있습니까?

감사합니다. 제 영어가 나쁘게 죄송합니다 ...

도움이 되었습니까?

해결책

둘 다 a PECL 그리고 BBCode 구문 분석 라이브러리. 소프트웨어는 스스로 수년간의 작업을 재창조하지 않고 충분히 어렵습니다.

그 중 어느 것도 옵션이 없다면 BBCode를 유효한 XML 문자열로 전환 한 다음 좋아하는 XML 구문 분석 루틴을 사용하는 데 집중했습니다. 여기서 매우 거친 아이디어이지만

  1. htmlspecialchars를 통해 코드를 실행하여 탈출이 필요한 엔터티를 피하십시오.

  2. 모든 [및] 문자를 각각 <과>로 변환합니다.

  3. tagname :과 같은 경우 콜론을 설명하는 것을 잊지 마십시오.

BBCode가 제대로 중첩 된 경우이 문자열을 XML 구문 분석 객체 (SimpleXML, DomDocument 등)로 전달하도록 설정해야합니다.

다른 팁

BBCode를 구문 분석하기위한 기존 라이브러리가 여러 개 있습니다. 자신의 것을 롤링하는 것보다 더 쉽게 조사하는 것이 더 쉬울 수 있습니다.

여기에 부부가 있습니다. 주위를 둘러 보면 더 많은 것이 있다고 확신합니다.
PECL BBCODE
배 html_bbcodeparser

bbcode 파서를 직접 조사했습니다. 그들 대부분은 Regex와 PHP4를 사용하여 PHP 5.2+에서 오류를 생성하거나 전혀 작동하지 않습니다. PECL BBCODE 및 PEAR HTML_BBCODEPARSER는 더 이상 유지 관리되지 않는 것으로 보이며 (2012 년 말) 작업 해야하는 공유 호스팅 설정에 쉽게 설치되지 않습니다. StringParser_bbcode 5.2+에 대한 약간의 조정과 함께 작동하지만 새 태그를 추가하는 방법은 서투르며 2008 년에 마지막으로 업데이트되었습니다.

Bing Search의 네 번째 페이지에 묻혔다 (나는 필사적이었다) 나는 찾았다 JBBCODE, 새로운 것처럼 보이고 PHP 5.3이 필요합니다. 미트 lisence. 나는 아직 맞춤형 태그를 만들지 않았지만 지금까지 PHP 5.3의 공유 호스팅 계정에서 상자에서 작동하는 유일한 태그입니다.

응답 : "더 나은 아이디어?" (그리고 나는 이것이 BBCode 특정 제안에 대한 개선을위한 초대라고 가정합니다)

우리는 최근에 BBCode 경로를 진행하는 것을보고 사용하기로 결정했습니다. htmlpurifier 대신에. 이 결정은 HTMLPurifier Group이 나열된 다양한 방법 간의 비교 (아마도 편향된) 비교에 부분적으로 기반을 두었습니다. 여기 그리고 bbcode에 대한 토론 (다시 Htmlpurifer Group의) 여기

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

사용 preg_split() ~와 함께 PREG_DELIM_CAPTURE 소스 코드를 태그와 비 태그로 분할하는 플래그. 그런 다음 열린 블록의 스택을 유지하는 태그를 반복하십시오 (즉, 열린 태그가 표시되면 배열에 추가하십시오. 닫는 태그가 표시되면 배열 끝에서 닫는 태그가 열리는 태그가 일치 할 때까지 요소를 제거하십시오.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top