질문/조언질답게시판

스킨에서 {$oDocument->getContent(false)}

 

본문을 불러와 보여주는데요. 가끔 회원분들중 과도한 엔터가 문서 하단에 들어간걸 그냥 보통 지우지 않으시는 경우가 있는데요.

스킨에서 본문을 불러오면서 내용의 끝부분에 위치한 반복되는 <p>&nbsp;</p> 를 제거해 버릴 수 있을까요 ??

 

 

  • profile

    {preg_replace('@(<p>&nbsp;</p>\s*)[email protected]', '', $oDocument->getContent(false))}

     

    이렇게 해보세요. 불러올 때마다 변환하는 것보다는 처음에 저장할 때 지우는 것이 더 효율적이긴 합니다만...

  • profile profile
    네. 저장할때 제거하는게 더 좋겠지만 아쉬워도 출력할때라도 가능하면 적용해 보려구요... 시도해겠습니다.
  • profile profile
    제거가 되지 않네요.
  • profile
    제글에는 50개 넘는 댓글이 많지 않아 여기 달아봅니다 ㅋ
  • profile

    아, 맨 뒤에 <!--AfterDocument(123,456)--> 주석이 자동으로 붙어서 정규식이 "끝"을 인식하지 못하는군요.

     

    {preg_replace('@(<p>&nbsp;</p>\s*)+(</div>\s*<!--AfterDocument\(\d+,\d+\)-->\s*)[email protected]', '$2', $oDocument->getContent(false))}

     

    이렇게 해보세요.

  • profile profile
    지금 문서 하나로 결과를 보고 있는데요..

    <p>요때도~~ #너구리 였답니다~~^^</p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p></div><!--AfterDocument(1400169,668731)--><script>
    jQuery(document).ready(function(){
    jQuery('.xe_content[class^=document_] a, .xe_content[class^=comment_] a').each(function() {
    var a = jQuery(this).attr('href');
    var b = /(aaaa.com)/g;
    if(!b.test(a)) {
    jQuery(this).attr('target', '_blank');
    }
    });
    });
    </script> </article>



    이렇게 article 범위 안에 애드온에서 넣은 것도 문제가 되는거 아닐까요 ??
    그건 아니겠죠 ??
    <!--AfterDocument
    요거로 위치를 잡아주신거 같아서 그건 아닌거 같긴 합니다...
  • profile profile
    script 부분이 글 내용을 불러오기 전에 (스킨 실행 전에) 이미 삽입되었는지, 아니면 불러온 후에 애드온에서 추가한 것인지에 따라 다릅니다. 대부분의 애드온은 글을 불러온 후에 추가하기 때문에 위의 정규식에는 영향을 주지 않습니다.
  • profile profile
    일단 적용했을때 와 아닐때 차이점이 발생하지 않고 있네요.
  • profile profile
    웹지기님 사이트는 <p>와 </p> 사이에 &nbsp;가 아니라 그냥 공백이 들어 있는 것 같아요.
    정규식에서 &nbsp;를 (?:&nbsp;|\s)로 바꿔보세요.
  • profile profile
    아니에요. 소스보기로 했을때는 공백으로 보이지만 개발자도구에서 보면 &nbsp; 가 들어가 있고 실제 문서를 수정모드에서 보면 들어가 있어요.

    혹시 다른 애드온때문은 아닌가 의심하고 있긴 합니다만...
    말씀 하신대로 수정해 보았는데 동일하네요.
  • profile profile
    제가 운영하는 다른 사이트에 적용해 보니 이 코드 동작 잘 하는 듯 합니다.
    아마 애드온 영향인지 무었때문인지 제가 적용하고 싶은 사이트는 안되는 상황이네요. 더 연구를 해봐야겠습니다.
  • profile
    이것도 시도 해보세요.
    {preg_replace('/(<p>(\s|&nbsp;)<\/p>\s*)+<\/div>/', '</div>', $oDocument->getContent(false))}
  • profile profile
    이것도 반응이 없네요 ㅡㅡ;
  • profile profile
    혹 캐시된 문서가 보여서 그런거 아닐까요? 테스트 해보니 작동합니닷
  • profile profile
    그럴까요?? 캐시 재생성을 해봐야 겠네요.. 로그인 했을경우 스킨에서 수정된게 바로 바로 보이긴 하던데요. 컨텐츠 불러온 부분은 서버에서 캐시된게 보일수도 있을까요 ? 한번 다시 해볼게요.
  • profile profile
    저희 사이트는 캐시문제는 아닌듯 하네요. 캐시재생성 해봤는데 여전히 안되네요. 뭔가 차이가 있을텐데 원인을 모르겠습니다.
  • profile profile
    엇 그럼 뭔가 다른 요소가 끼어 있나보네요. 아니면... 혹시라도 필요한 부분이아닌 다른곳의 스킨을 수정 하셨다던지? ^^;;;
  • profile profile
    스킨에서 영향받을 일은 거의 없을 거 같긴 한데요.
    제가 운영하는 다른 사이트에 기진곰님 소스도 해보니 잘 됩니다. 뭔가 애드온의 영향인지 알 수 가 없네요.
  • profile profile
    제가 확인해 본 방법은 스케치북 게시판스킨의 _read.html의
    <article>{$oDocument->getContent(false)}</article>부분을 수정해서 테스트 해봤습니다.
  • profile profile
    네. 거기를 수정해서 적용하려는데 한 사이트는 안되고 한 사이트는 되네요. 이상합니다. 모바일스킨에서도 안되는 거보니 서버환경이나 애드온등의 문제일 수 있는데 의심되는 애드온 다 제외해 봐도 안되네요 ,,;
  • profile
    php 버전 차이인지 뭔지 잘 안되네요... 포기.....
  • profile profile
    공백검사 강화버전으로 마지막 시도를 해보세요... 애드온으로 만드는 방법이 있기는 하겠습니다만 이것을 위해 애드온을 사용하는게 효율적인지는 모르겠습니다 @[email protected]
    {preg_replace('/(<\s*p\s*>[\s|&nbsp;]*<\s*\/p\s*>\s*)+<\s*\/div\s*>/i', '</div>', $oDocument->getContent(false))}
  • profile profile
    네. 역시 잘 안되요. 이상하게 정규식이 적용이 안되는건지 아니면 해당부분을 못찾는건지 안되네요. 안되도 크게 상관 없는 기능이지만 궁금증이 남아서 미치겠네요 ㅋ
  • profile profile

    헐... 저도 궁금증이 발동하네요. 혹시 아래 코드를 사용하시는 애드온에 추가하시고 테스트 해보실 수있나요?

    if($called_position == 'after_module_proc' && $this->act == 'dispBoardContent')
    {
    $oContext  = Context::getInstance();
    $oDocument = Context::get('oDocument');
    
    if($oDocument->variables['document_srl'])
    {
    $oDocument->variables['content'] = preg_replace('/(<\s*p\s*>[\s| ]*<\s*\/p\s*>\s*)+<\s*\/div\s*>/i', '</div>', $oDocument->variables['content']);
    }
    }

     

  • profile profile
    제일 만만한 오토링크 애드온에 넣어봤는데 안되네요....
  • profile profile
    아 콘텐츠에는 div가 없을꺼에요. 제일 처음에 기진곰님이 적어주신 코드로 대체 해보세요.
  • profile profile
    $oDocument->variables['content'] = preg_replace('@(<p>&nbsp;</p>\s*)[email protected]', '', $oDocument->variables['content']);

    이렇게요 ? 역시 안되네요. 저희 사이트 서버가 뭔가 비밀이 있는거 같네요. 이도 저도 다 안되는거 보니까요.
  • profile profile
    헐... 이거는요?
    $oDocument->variables['content'] = preg_replace('@(<\s*p\s*>[\s|&nbsp;]*<\s*\/p\s*>\s*)[email protected]', '', $oDocument->variables['content']);
  • profile profile
    네. 여전히 안되요. 저희 사이트는 소생이 힘들거 같네요 ㅡㅡ;
  • profile profile
    저희가 뭔가 빼먹고 있는건가요? ㄷㄷㄷ
    if문 안에 @file_put_contents('./files/content.txt', $oDocument->variables['content']);
    만 넣고 게시판 읽어보신후 ./files/content.txt파일 열어서 태그가 어떻게 출력되는지 확인 해보세요.
  • profile profile

    전혀 이상한 컨텐츠가 들어있는데요 ????

    아... 내가 읽은 글이 아닐 수 있군요...

  • profile profile
    어.. 뭔가 이상합니다. 1개의 글의 내용만 계속 담겨있네요. 근데 제가 읽은 글이 아니에요.
  • profile profile

    누군가 글을 읽은건지 생성된 이후 제가 글을 읽으면 생성이 안되네요. 지우고 다시 글을 읽어봐도 안생깁니다.

    생성되는 파일이 무작위라 제가 분석하기 너무 어렵네요.

  • profile profile
    정말 어렵게 비교 가능한거 하나 건졌습니다.

    애드온에서 처리하기 전

    <p>신나는 하루였어요 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ</p>

    <p></p>

    <p>&nbsp;</p>

    <p></p>


    처리하 ㄴ후

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>신나는 하루였어요 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ</p>



    제거가 잘 된듯 합니다.


    실제 문서에서도 확인하니 공백이 없어 보입니다.

    그런데 일부 문서는 안되는거로 최종 확인이 되는거네요. 제가 계속 모니터링 했던 문서는 안되는 거였습니다.
  • profile profile

    if문 안에
    $logged_info = Context::get('logged_info');
    if($logged_info->is_admin == 'Y')
    @file_put_contents('./files/content.txt', $oDocument->variables['content']);

    관리자 일때만 생성하게 해보세요.

  • profile
    엇 제 댓글이 이상하게 꼬였네요? ㅎㅎㅎ
  • profile profile
    되는문서가 있고 안되는 문서가 있는 모양입니다.
    말씀하신대로 관리자로 조건 걸고 안되는 문서 한번 살펴볼게요. 근데 그 문서 파일이 안만들어졌던거로....
  • profile profile
    어렵네요 ㅋㅋ


    <p>요때도~~ #너구리 였답니다~~^^</p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>

    <p> </p>


    이것 처럼 공백이 그대로 남아있는 것으로 파일에 기록되어 있습니다.
  • profile profile

    잘 되는 문서를 수정모드에서 보면 공백이..
    <p>신나는 하루였어요 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>




    안되는 문서 수정해서 보면 공백이...

    <p>요때도~~ #너구리 였답니다~~^^</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>



    제눈으로는 차이가 없습니다 ㅡㅡ;

     

     

  • profile profile
    안되는 문서 txt파일 첨부좀 해주세요. 윗쪽 내용은 지우셔도 상관없구요.
  • profile profile
    #기호를 넣어서 저희는 태그를 넣거드요. 태그라기보다는 #기호가 들어가 있는 문서가 안되는 듯 합니다.
  • profile profile
    #기호 넣고 신규문서 짧게 작성한건 또 되네요 ㅡㅡ;
  • profile profile
    안되는 문서 형태를 알려주시거나 txt파일 첨부 해주세요.
  • profile profile
    안되는 문서는 저장된 파일에서

    <p> </p> 으로 공백이 처리되어 보이구요.


    되는 문서 저장된 파일의 줄바꿈 공백들은
    <p>&nbsp;</p>

    로 저장되어 있음이 확인 됩니다.

    어떠한 이유로 줄바꿈이 잠시 바뀌는 듯 합니다.
  • profile profile
    해시태그 애드온으로 #기호와 붙여 넣은 단어를 태그로 밀어넣고 그리고 태그링크 형태로 본문으로 보여주는 글들에서 문제가 발생합니다.

    그런데 웃긴건 이렇게 저장된 글의 경우 해시태그애드온을 잠시 해제해도 안되구요.

    #기호 붙은 단어를 본문에서제거(태그도 제거됩니다.) 하면 정상으로 줄바꿈이 없어집니다.
  • profile profile
    일부 문서는 해시태그 애드온 해제로 정상화 되는 문서도 있습니다.

    결국 이 애드온의 영향으로 공백처리가 <p> </p>

    바뀌는 문제인듯 합니다.


    <p> </p>
    <p>&nbsp;</p>

    모두 제거하면 해결 될 것 같습니다.
  • profile profile

    안되는 문서 저장된 파일입니다.

  • profile profile
    말씀하시는 태그를 사용자가 입력한다면...

    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>#태그 #태그</p>

    아니면
    <p>&nbsp;</p>
    <p>#태그 #태그</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>

    이런 형태로 되지 않나요?

    마지막 공백을 제거하면...
    위의것은 결과가
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>#태그 #태그</p>

    아래것은 결과가
    <p>&nbsp;</p>
    <p>#태그 #태그</p>

    형태로 출력이 될텐데요?
  • profile profile
    해시태그 애드온의 called_position이 어디 인가요?
  • profile profile
    안되던 문서도 저장을 다시 하면 됩니다. 신기하게요... ㅡㅡ;
  • profile profile
    네. 잘 되는 경우 이렇게 되지요...
  • profile profile
    https://www.xpressengine.com/index.php?mid=download&package_id=22753681
  • profile profile
    안되던 문서 저장하면 잘 된다는게 최고관리권한계정의 경우로 수정하면 잘되는거네요.
  • profile

    @prologos
    페이지가 넘어가서 다시 여기에 정리합니다.

    해시태그애드온과 관련성은 있어보입니다.
    뭔가 안되던게 다시 잘 되었던 건 "최고관리자 권한"의 계정으로 수정해서 되는 것으로 확인 되었습니다.

    잘 안되는 파일은 먼저 댓글에 첨부해 드렸습니다.

     

     

    해시태그온 애드온 사용시 일반계정으로 글 등록시 줄바꿈이

    <p> </p> 로 바뀌어 등록되는 듯 합니다. 

    최고관리자 계정으로 다시 수정하면 원래 줄바꿈으로 되는거 같구요.

     

    꼭 해시태그온 영향이 아니더라도 <p> </p>로 변해버리거나 작성된 줄바꿈이 처리되지 않는거니 이것 까지 처리되면 문제가 없어 보입니다.

     

  • profile
    파일을 보니 원인을 알겠네요 ㅠㅠ
    어떤 애드온이나 모듈에서 글을 저장할때 utf encoding해서 저장하나 보네요. 공백이 변경되어있어서 여태 테스트한 정규식에서는 검출을 못한겁니다 ㅠㅠ

    '@(<\s*p\s*>([\xA0|\xC2|\s|&nbsp;])*<\s*\/p\s*>\s*)[email protected]'

    이걸로 테스트 해보세요.
  • profile profile
    이거 혹시 이모티콘 사용하게 해주는 애드온이 관여하는 걸까요 ? @기진곰님... 아니겠죠 ????
  • profile
    애드온 말고 스킨에서도 아래 코드로 테스트 해보세요

    {preg_replace('/(<\s*p\s*>[\xA0|\xC2|\s|&nbsp;]*<\s*\/p\s*>\s*)+<\s*\/div\s*>/i', '</div>', $oDocument->getContent(false))}
  • profile profile
    와!!!! 복받으실 겁니다. 정말 두가지 경우 다 처리가 되네요. 줄바꿈 공백이 두가지 타입으로 나오니 정말 이거 알아내는데 정말 힘들었네요. 정말 수고 많이 해주셨어요. 감사합니다.
  • profile profile
    오늘 하루 XE공부는 이걸로 끝~~~~ ㅎㅎㅎ
    수고하셨어요.

서버에 요청 중입니다. 잠시만 기다려 주십시오...