code 블럭 안의 내용은 필터링되지 않게 하고 싶습니다.

code 블럭 안의 내용은 필터링되지 않게 하고 싶습니다.

QA

code 블럭 안의 내용은 필터링되지 않게 하고 싶습니다.

답변 1

본문

https://sir.kr/g5_plugin/7337

 

현재 마젠토님의 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
 
// 어때요? 참 쉽죠?

주석 처리한 부분에 있어요.
1. 코드 블록 문자열 치환
2. HTML Purifier 적용
3. 코드 블록 원래대로 치환

찾아보니까 19년 전의 방법이네요.
그때는 정규식 안쓰고 문자열 처리한 것 같은데, 소스가 안보이네요. 하아...

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 16
© SIRSOFT
현재 페이지 제일 처음으로