2010-07-17 5 views
2

나는 BBCode는 구문 분석이 기능이 -> HTML :BBCode는 unparser 정규식 도움

$this->text = preg_replace(array(
    '/\[b\](.*?)\[\/b\]/ms', 
    '/\[i\](.*?)\[\/i\]/ms', 
    '/\[u\](.*?)\[\/u\]/ms', 
    '/\[img\](.*?)\[\/img\]/ms', 
    '/\[email\](.*?)\[\/email\]/ms', 
    '/\[url\="?(.*?)"?\](.*?)\[\/url\]/ms', 
    '/\[size\="?(.*?)"?\](.*?)\[\/size\]/ms', 
    '/\[youtube\](.*?)\[\/youtube\]/ms', 
    '/\[color\="?(.*?)"?\](.*?)\[\/color\]/ms',  
    '/\[quote](.*?)\[\/quote\]/ms', 
    '/\[list\=(.*?)\](.*?)\[\/list\]/ms', 
    '/\[list\](.*?)\[\/list\]/ms', 
    '/\[\*\]\s?(.*?)\n/ms' 
    ),array(
    '<strong>\1</strong>', 
    '<em>\1</em>', 
    '<u>\1</u>', 
    '<img src="\1" alt="\1" />', 
    '<a href="mailto:\1">\1</a>', 
    '<a href="\1">\2</a>', 
    '<span style="font-size:\1%">\2</span>', 
    '<object width="450" height="350"><param name="movie" value="\1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="\1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="350"></embed></object>', 
    '<span style="color:\1">\2</span>', 
    '<blockquote>\1</blockquote>', 
    '<ol start="\1">\2</ol>', 
    '<ul>\1</ul>', 
    '<li>\1</li>' 
    ),$original); 

문제, 어떻게 HTML처럼,이 unparse하는 것입니다 -> BBCode는?

내 정규식 기술은 가난한 :(

감사합니다.

답변

7

하지.

원래 원래의은 해석되지 않은 텍스트이고 은 처리 된의 구문 분석 된 텍스트를 모두 저장하십시오. 예,이 스토리지 요구 사항을 두 배로, 그러나 그것은 또한 눈부시게 쉽게 할 수 있습니다 : 다시 을 구문 분석하지 않고

  1. 다시 밖으로
  2. 다른 사용자 게시물의 인용을 허용 BBCode는 구문 분석하지 않고 원래의 사용자 편집을 허용 각 BBCode를 생성하는 HTML을 변경
  3. 라인 (다시, 단지 모든 것들을 다시 구문 분석)
+0

+1 사실 BBCode 형식으로 데이터를 사용할 수 있다면 훨씬 더 좋습니다. – Wrikken

+0

고마워. 원래 생각했던 것보다 더 나은 접근 방법이라고 생각해. – Rodrigo

5

그것은 정규 표현식에 단지 회전과 BBCode는 HTML을 변환하는 신뢰할 수있는 방법을 구축하는 것은 불가능 가까이의 말을 매우 안전합니다.를 사용하여 파서 (DOMDocument를 예를 들어), XPath는의 & 검사와 속성 & 유효하지 않은 요소를 제거하고 재귀 적 방법에 BBCode는 문자열을 만들기를 걸어 (또는/잘못된 태그를 무시하는 방식에 속성).

+0

고마워! 조랑말 토니가 오지 않을거야. –

+0

음, 분명히 신경 써야 할까? "조랑말 토니가 오지 않을거야." 내 호감으로는 조금 이상하다.) – Wrikken

+0

BBCODE는 HTML과 같은 재귀 구조를 가지고 있기 때문에 다음이 적용된다 : http://stackoverflow.com/a/1732454/193892 –

3

당신이 정확하게 HTML 코드는 WA 알고 있다면 아래

  • 스위치 BBCode는 엔진 (단지 모든 것들을 다시 구문 분석) 귀하의 방법을 사용하여 de-bbcode로 인코딩하는 방법은 다음과 같습니다.

    전달할 두 배열을 preg_replace으로 전환하십시오.

    HTML 코드가있는 배열에서 모든 요소에 대해 다음을 수행하십시오. 문자열 앞에 #을 붙입니다. 첨부 #s. \1 (및 \2 aso)을 (.*?)으로 바꿉니다.

    bbcodes가있는 배열의 경우 모든 요소와 함께 다음을 수행하십시오. 처음에 /을 제거하고 끝에 /ms을 제거하십시오. \s으로 대체하십시오. 모두 \을 삭제합니다. 모두 ?을 삭제합니다. 문자열의 첫 번째 (.*)$1으로 바꾸고 두 번째 문자를 $2으로 바꿉니다.

    이 작업을 수행해야합니다. 문제가있는 경우 : Ask;)