2009-11-23 3 views
1

나는 PHP에서 매우 간단한 마크 업 파서를 만들었다. 그러나, 현재 str_replace를 사용하여 마크 업과 html 사이를 전환합니다. 내용을 변경하지 않은 "코드"상자 (결국 GeSHI를 사용합니다)를 만들려면 어떻게해야합니까?PHP에서 마크 업 파서 작성하기

바로 다음 코드는 입니다.이 코드 상자는 <b>Some bold text</b>으로 해석됩니다.

몇 가지 조언이 필요합니다. 어떤 옵션이 가장 좋습니까?

  • 는 개별적으로 각 단어를 확인했으며, 그것은 [코드]의 내부가 아닌 경우,이
  • 이 그대로 맡겨 분석한다 상자에 사용자가 [코드]의 내부 마크 업을 게시 할 수 없습니다 수 있습니다.
  • 특별히 HTML 마크 업용으로 다른 유형의 코드 상자를 만듭니다. < 또는>를 [및]로 자동 회신하십시오.

다른 옵션이 있습니까? 이것은 내가 생각했던 것보다 약간 힘들다 ...

편집 :이 파서에 코드 박스 유형을 추가하는 것이 가치가 있나? 내 말은, 그것이 유용 할 수있는 방법을 알고 있지만, 작은 결과를 얻으려면 다소 많은 노력이 필요합니다.

답변

2

str_replace를 사용하기 위해 여러 개의 문자열로 나눌 수 있습니다. 코드 상자를 별도의 문자열로 저장하여 [코드] 및 [/ 코드] 태그에 문자열을 분할하십시오. 어떻게 원래의 문자열에 들어 갔는지 기록해 두십시오. 그런 다음 원본 문자열에 str_replace를 사용하고 코드 상자 문자열에서 원하는대로 구문 분석을 수행하십시오. 마지막으로 구문 분석 된 코드 상자를 다시 삽입하고 표시합니다.

그러나 경고의 한마디로, 입력을 html로 표시하면 본질적으로 위험한 것으로 나타납니다. 재 입력을 위해 html로 변환하기 전에 많은 양의 입력 sanitization 및 검사를 권장합니다.

+0

모든 것을 HTML로 변환하지 않고 특정 배열 만 변환합니다. 그리고 < and >은 html 엔티티로 변환됩니다.) – Cyclone

+0

그리고 네, 그게 내가 할 일이라고 생각하고 있습니다. – Cyclone

+0

4 년 전부터 답변을 찾은 순간. 그리고 당신의 제안에 놀랄 것입니다 .O.O이 방법은 효과가 없을 것이라고 말하지 않지만, 사람은 최적의 해결책에서 멀리 떨어져 있습니다. –

3

왜 당신은 바퀴를 재발 명하겠습니까?

이미 markup parsers이 많이 있습니다.

어쨌든 str_replace 만 도움이되지 않습니다. 정규 표현식을 배워야하고, 그들이 말하는 것처럼, now you've got two problems;)

+0

가능한 경우 직접 시도하고 싶습니다. 어쨌든 거의 완료되었습니다. 사실 str_replace는 코드 박스 스피드 범프에 충돌 할 때까지 작동합니다. – Cyclone

+0

나는 많은 시간을 바퀴를 재발 명했다. 나는 다른 사람들의 코드가 좋지 않거나 싫어서가 아니다. 단지 당신을 더 나은 프로그래머로 만들고 필요한 경험을 제공합니다. 실제로 정규 표현식을 사용하여 마크 업 파서 (생산 품질)를 작성했습니다. 나는 이것이 바람직하지 않다는 것을 말할 수있다. 보안 문제는 다소 있습니다. 이 날짜가 있기는하지만 미래의 모든 사용자가 빌드를 작성하면 학습 경험을 즐기지 만, 프로덕션 환경에서는 사용하지 않을 것입니다. – frostymarvelous

0

HTML 미인은 꽤 달콤합니다. http://pear.php.net/package/PHP_Beautifier. 아마도 데코레이터 클래스를 가지고있어 아마도 당신의 요구에 맞을 것입니다.

+0

데코레이터 클래스가 내 마크 업 태그와 같은 것을 처리합니까? – Cyclone

0

분명히 말하면 문제는 두 부분으로 나뉩니다. 첫 번째 부분은 어휘 분석기가 "코드"를 "언어"에 대한 키워드로 나눌 필요가 있다는 것입니다. 어휘 분석기가 있으면 파서가 필요합니다. 파서는 논리적 (일반적으로 재귀 - 강하 방식) 방식으로 한 번에 한 단어 씩 키워드를 받아들이는 코드입니다.