code 블럭 안의 내용은 필터링되지 않게 하고 싶습니다.
본문
현재 마젠토님의 vditor를 그누보드에 테스트 중입니다.
마크다운의 위력을 눈으로 확인할 수 있어서 정말 좋습니다.
다만 코드 블럭의 내용이 htmlpurifier에게 필터링 되는 것이 가장 아쉬운 점입니다.
현재 SIR나 아미나에서는 코드블럭의 내용은 필터링되지 않고, 내용도 실행되지 않습니다.
<link rel="stylesheet" href="<?php echo G5_EDITOR_URL; ?>/vditor3/dist/index.css">
<script src="<?php echo G5_EDITOR_URL; ?>/vditor3/dist/index.min.js"></script>
<script src="<?php echo G5_EDITOR_URL; ?>/vditor3/editorOptions.js"></script>
위 내용의 경우 필터링되면 그냥 전부 없어져버립니다.
하지만 SIR나 아미나에서는 코드블럭 안에서 전부 살아있고, 파일을 불러오지도 않습니다.
코드블럭 안에 있는 경우 TEXT 같은 형태로 출력되게하면 문제가 해결될 것 같은데요.
도저히 감이오질 않아 헤매고 있습니다. ㅠㅠ
예시로
https://gnu.hubs.tk/bbs/board.php?bo_table=free&wr_id=2
위 게시판의 내용의 경우 밑에 댓글과 100% 같습니다.
댓글처럼 코드부분만! 텍스트형태로 치환되는게 제일 좋은 것 같은데요.. 어렵네요..
!-->답변 1
// [code]~[/code] 부분만 원래의 문자열을 유지하는 방법 문의인가요?
// 구현 방법이야 다양하겠으나, 옛날 옛적에 코드 하이라이트 구현한다고 작성했던 코드가 떠오르는군요.
// 방법은 굉장히 단순합니다. 간단하니까 예제 코드 참고로 추가합니다.
// 예를 들어 아래처럼 입력이 되었다고 가정 - 편의상 줄바꿈 생략, <code>~</code>로 표현
$html = '내용1<code>첫 번째 블록</code>내용2<code>두 번째 블록</code>내용3';
preg_match_all('#<code>.+?</code>#s', $html, $matches); // 정규식을 이용해 코드 블록 구하기
$change_a = []; // A->B 치환용
$change_b = []; // B->A 치환용
foreach ( $matches[0] as $k=>$v ) { // 블록 반복
$key = '[CODE'.$k.']'; // 내용에 사용되지 않을 구분자 문자열 추천
$change_a[$v] = $key;
$change_b[$key] = $v;
}
// 본래의 내용에서 코드 블록 부분의 문자열을 먼저 치환
$html = strtr($html, $change_a); // 내용1[CODE0]내용2[CODE1]내용3 ... 이런 내용이 됩니다.
// HTML Purifier 를 적용해주고
// : 생략
// $html = $purifier->purify($html);
// 다시 코드 블록을 원래의 문자열로 치환
$html = strtr($html, $change_b); // 내용1<code>첫 번째 블록</code>내용2<code>두 번째 블록</code>내용3
// 어때요? 참 쉽죠?
답변을 작성하시기 전에 로그인 해주세요.