질문/조언질답게시판
Extra Form
PHP PHP 7.0
CMS Rhymix

안녕하세요.

라이믹스(혹은 ckeditor)에서 내용 없이 빈 span 태그는 삭제가 잘 됩니다만 안에 내용이 있을 경우 style이나 기타 attribute가 없더라도(<span>만 있을 경우) 삭제되지 않고 남아 있습니다.

이를 없앨 수 있는 방법이 있을까요?

 

그러니까

<p><span>텍스트</span></p>

(혹은 <p><span><span>텍스트</span></span></p>)

<p>텍스트</p>

로 정리하고 싶습니다.

 

참고로 유저들이 한글 등 워드프로세서나 웹에서 복사한 글을 그대로 붙여 넣을 경우 붙는 쓸모없는 태그를 삭제하고 싶어 ckeditor의 config.js 파일에

config.disallowedContent = 'span[*lang*]{font-family,text-decoration,text-autospace,*spacing,white-space,text-transform,line-height}';

를 넣었기 때문에 생기는 상황입니다.

감사합니다.

  • profile
    <span>과 </span>을 모두 제거하는것을 말씀하시는거죠?

    ckeditor 일 경우 modules/editor/skins/ckeditor/editor.html 파일에 아래의 스크립트를 추가해 보세요.

    <script>
    var empty_span= xe.createPlugin("empty_span", {
    API_BEFORE_VALIDATE : function(sender, params) {
    $isEditorContent = jQuery(params[0]).find('input[name=content]');
    if(!$isEditorContent.length) return true;
    var editerValue = jQuery(params[0]).find('input[name=content]').val();
    editerValue = editerValue.replace("<span>","");
    editerValue = editerValue.replace("</span>","");
    jQuery(params[0]).find('input[name=content]').val(editerValue);
    return true;
    }
    });

    jQuery(function($){
    var oEmpty_span = new empty_span();
    xe.getApp("Validator")[0].registerPlugin(oEmpty_span);
    });
    </script>
  • profile ?

    답변 감사합니다.

    그런데 알려주신 방법은 반복된 <span>에는 작동하지 않습니다.

    가령 사용자가 입력한 아래 원문이

    <p align="center" style="text-align:center;"><span style="font-size:10pt;"><span style="font-family:'맑은 고딕', sans-serif;"><span><span style="color:#000000;"><span style="font-style:normal;"><span><span style="font-weight:normal;"><span style="letter-spacing:normal;"><span><span style="text-transform:none;"><span style="white-space:normal;"><span><span style="word-spacing:0px;"><span><span style="text-decoration:none;"><span lang="en-us" style="font-size:14pt;" xml:lang="en-us"><span style="color:#000000;">&lt;<b>2019 </b></span></span><b><span style="font-size:14pt;"><span style="color:#000000;">세미나&gt;</span></span></b></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>

    제가 넣은 config.disallowedContent에서 필터링되면 ckeditor에서

    <p style="text-align:center"><span style="font-size:10pt"><span><span><span style="color:#000000"><span style="font-style:normal"><span><span style="font-weight:normal"><span><span><span><span><span><span><span><span><span style="font-size:14pt"><span style="color:#000000">&lt;<strong>2019 </strong></span></span><strong><span style="font-size:14pt"><span style="color:#000000">세미나&gt;</span></span></strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>

    가 되고, 알려주신 방법을 적용하여 저장한 글은

    <p style="text-align:center"><span style="font-size:10pt"><span><span style="color:#000000"><span style="font-style:normal"><span><span style="font-weight:normal"><span><span><span><span><span><span><span><span><span style="font-size:14pt"><span style="color:#000000">&lt;<strong>2019 </strong></span><strong><span style="font-size:14pt"><span style="color:#000000">세미나&gt;</span></span></strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>

    이 됩니다.

    제가 개발자가 아니라 그냥 사이트 관리자라 조건 반복문을 만들 수가 없네요.ㅠㅠ

  • ? profile

    위 댓글의 스크립트는 form 전송전 처리를 하는것인데요.

    에디터상에 소스가 질문의 내용처럼 "<p><span>텍스트</span></p>(혹은 <p><span><span>텍스트</span></span></p>)" 로 입력 되어있다면 답변의 스크립트가 작동될겁니다.

    필터링을 거쳐서 내용이 D/B에 입력된후  "<span>문자</span>"에서 "<span>","</span>"을 제거하고 싶으시다면 애드온이나 모듈을 개발하셔서 처리하는 방법을 추천드립니다.

  • profile ?

    제가 원했던 것도 구름이 님께서 생각하신 그 방법(form 전송전 처리)입니다.

    다만 루프가 제대로 돌지 않는 것 같아서 재차 질문 드렸던 거고요(for나 while이 없어도 루프가 도나요?).

    첫 댓글의 스크립트를 적용하면 <p><span><span>텍스트</span></span></p>라도 마찬가지로 한 번만 삭제됩니다.

    중간에 다른 게 끼어있지 않아도 그래요.

    알려주셨던 방법을 적용해도

    <p><span><span>123</span></span></p>
    <p><span><span><span>456</span></span></span></p>
    <p><span>789</span></p>

    <p><span>123</span></p>
    <p><span><span><span>456</span></span></span></p>
    <p><span>789</span></p>

    로 첫 문단의 <span> 하나만 제거됩니다.

    어쨌든 친절하신 답변 감사드립니다!

  • ? profile
    아래와 같이 변경해보세요.

    <script>
    var empty_span= xe.createPlugin("empty_span", {
    API_BEFORE_VALIDATE : function(sender, params) {
    $isEditorContent = jQuery(params[0]).find('input[name=content]');
    if(!$isEditorContent.length) return true;
    var editerValue = jQuery(params[0]).find('input[name=content]').val();
    editerValue = replaceAllTest(editerValue,"<span>","");
    editerValue = replaceAllTest(editerValue,"</span>","");
    jQuery(params[0]).find('input[name=content]').val(editerValue);
    return true;
    }
    });

    function replaceAllTest(str, searchStr, replaceStr) {
    return str.split(searchStr).join(replaceStr);
    }

    jQuery(function($){
    var oEmpty_span = new empty_span();
    xe.getApp("Validator")[0].registerPlugin(oEmpty_span);
    });
    </script>
  • profile ?
    감사합니다!
    잘 되네요.
    다만 정상적인 <span style="~~~">을 닫는 </span>도 지워져서 그냥 editerValue = replaceAllTest(editerValue,"</span>",""); 이 부분을 빼버리고 적용했습니다.^^;
    다시 한번 감사드립니다!
  • ? profile
    그러면 닫히지 않은 태그가 발생 될텐데요.
    스타일이 포함된 경우를 정규식을 통해 replace 처리하시는게 좋습니다.
  • profile ?
    </span> 자체가 닫는 태그라 여분으로 들어가도 문제는 없더라고요.^^

    참고로 구름이 님께서 알려주신 방법 말고 ckeditor에 내장된 기능으로도 <span>을 제거할 수 있었습니다.
    아래는 새롭게 알아내 적용한 방법입니다.

    /modules/editor/skins/ckeditor/editor.html
    106행 allowedContent: true, 주석 처리 혹은 삭제
    /modules/editor/tpl/js/editor.app.js
    42행 allowedContent: true, 주석 처리 혹은 삭제

    https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html
    allowedContent를 true로 하면 ckeditor의 Content Filtering (ACF)가 비활성화됨 -> 해당 설정 삭제로 ACF 다시 활성화.
    왜 라이믹스에서 ckeditor의 ACF를 비활성화했는지는 모르겠는데(보안 문제?) 일단 당장은 문제가 보이지 않았습니다.