Extra Form
PHP PHP 7.4
CMS Rhymix 2.0

 

확장 변수로 텍스트가 입력되어 있는데, \n 이나 ** 등이 포함되어 있습니다.

이걸 본문에서  {$oDocument->getExtraEidValue('key_sentence')} 이렇게 출력하는데

\n 은 줄바꿈, **로 둘러싸인 텍스트는 bold 처리하기 위해서,

 

<script>
        document.addEventListener("DOMContentLoaded", function() {
            // 특정 요소의 \n을 <br>로 바꾸는 함수
            function replaceNewlinesInElement(element) {
                // 요소의 자식 노드들을 순회
                element.childNodes.forEach(function(node) {
                    // 텍스트 노드일 경우 \n을 <br>로 변환
                    if (node.nodeType === Node.TEXT_NODE) {
                        const replacedText = node.textContent.replace(/\n/g, '<br>');
                        const newNode = document.createElement('span');
                        newNode.innerHTML = replacedText;
                        node.replaceWith(newNode);
                    }
                });
            }

            // 모든 .model_answer_details-content 요소들에 적용
            const elements = document.querySelectorAll('.model_answer_details-content');
            elements.forEach(function(element) {
                replaceNewlinesInElement(element);
            });
        });
    </script>

 

이렇게 해봤는데 전혀 안먹혀요.

 

도와주세요 ㅠ.ㅠ

  • Lv36

    확장변수를 출력하는 과정에서 변환하는 것이

    이미 출력해 놓은 확장변수를 나중에 조작하는 것보다 훨씬 깔끔하고 안전합니다.

    즉 자바스크립트는 단 한 줄도 작성할 필요가 없습니다.

     

    예를 들어 getExtraEidValue 대신 getExtraEidValueHTML을 사용하면

    줄바꿈은 코어가 알아서 <br>로 변환해 줍니다. 굳이 다른 데서 수십 줄의 코드를 작성할 필요가 없죠.

    그 밖의 특수문자 변환도 이 부분에서 PHP 함수나 정규식으로 치환하시고요.

  • Lv36 Lv5
    기진곰님 답변주셔서 감사합니다. 그런데 그게 원래 코드가 사실 getExtraEidValueHTML 이었는데 안되서 검색하다가 고쳐본게 getExtraEidValue 라서요. 즉, getExtraEidValueHTML일때도 전혀 되지가 않더라구요. https://scorefactory.io/factory2ielts?list_type=card&search_target=tag&search_keyword=Describe+an+occasion+when+you+helped+a+family+member%2Frelative+with+something
    여기서 첫번째 카드의 모범답안 버튼을 누르시고, 모달창 하단쯤에 Key Sentences 와 Good Vocabularies 항목을 보시면 \n\n 또는 \n 등이 출력되는 것을 확인할 수 있어요.
    (현재는 getExtraEidValueHTML 다시 돌려놓았습니다)
  • Lv5 Lv36

    인코딩 문제인 것 같습니다. 일반적으로 말하는 \n은 줄바꿈, 즉 아스키 코드 10번을 의미합니다. 그런데 맘잉님 사이트에서는 실제 백슬래시 문자와 알파벳 소문자 n, 즉 아스키 코드 92번과 110번이 표시되고 있습니다. 이건 줄바꿈과는 다른 문제입니다. 이중으로 인코딩되었거나, 인코딩한 방식과 다른 방식으로 디코딩되었을 수도 있고요.

     

    원본 데이터가 DB에 어떻게 저장되어 있는지, 그 데이터가 어떤 과정을 거쳐서 화면에 표시되는지 추적해 보아야 합니다. 페이지 소스에 원래부터 들어 있던 내용이 아니고 JS로 불러와서 뿌려주는 것 같은데, 그렇다면 어딘가에서 이중으로 인코딩될 가능성이 더욱 높아집니다.

    아니면 그냥 저 부분을 출력하실 때 str_replace 함수로 '\\n'을 '<br>'로 치환해 보세요. (실제 줄바꿈이 아닌 백슬래시 문자를 캐치하려면 홑따옴표를 사용하고 백슬래시를 2개 써야 안전합니다.)

  • Lv36 Lv5

    1. db 에 저장된 value는 아래와 같습니다.

     

    One memorable occasion when I helped a family member was about two years ago when my younger sister was preparing for her university entrance exams.\n기억에 남는 가족 구성원을 도와준 경험은 약 2년 전, 여동생이 대학 입학 시험을 준비할 때였습니다.\n\nShe was feeling overwhelmed with the sheer volume of material she had to cover and was struggling to manage her time effectively.\n그녀는 다뤄야 할 방대한 양의 자료에 압도당하고 있었고 시간을 효율적으로 관리하는 데 어려움을 겪고 있었습니다.\n\nI helped her create a detailed study schedule, breaking down her subjects into manageable chunks and prioritizing the areas she found most challenging.\n나는 그녀가 세부적인 학습 일정표를 만들도록 도왔고, 과목들을 관리 가능한 단위로 나눠 가장 어려워하는 분야에 우선순위를 두도록 했습니다.\n\nSeeing her gradually regain her confidence and improve her understanding of the subjects was incredibly satisfying.\n그녀가 점차 자신감을 회복하고 과목에 대한 이해도를 높이는 모습을 보는 것은 정말 만족스러웠습니다.\n\nUltimately, she performed exceptionally well in her exams and secured a place at her desired university.\n결국 그녀는 시험에서 뛰어난 성적을 거두었고 원하는 대학에 입학하게 되었습니다.

     

    2. ChatGPT api가 JSON 형태로 출력한 값이 확장변수로 들어가는데, 대부분은 줄바꿈이 잘적용되서 들어가지만 가끔 이런 문제가 생깁니다. 아마 가끔 markdown? 형태로 출력해서 생기는 문제가 아닐까 합니다. 정상적으로 입력된 db 값을 찾아보니 아래와 같습니다.

     

    People often learn that their neighbours need help through various signs and indications.
    사람들은 다양한 신호와 징후를 통해 이웃이 도움이 필요하다는 것을 알게 됩니다.

    For example, you might notice that a usually active neighbour has become less visible in the community.
    예를 들어, 보통 활발한 이웃이 갑자기 커뮤니티에서 덜 보이게 되었을 때입니다.

    Additionally, observing someone's house can also give clues, such as a lawn that is not maintained or newspapers piling up.
    또한, 누군가의 집을 관찰하면서도 단서를 얻을 수 있는데, 잔디가 관리되지 않거나 신문이 쌓이는 것을 볼 수 있습니다.

     

    3. str_replace 함수로 '\\n'을 '<br>'로 치환해 보세요. ->> 이렇게 하니까 줄바꿈에는 성공했는데, 새로운 문제가 발생합니다 ㅠ.ㅠ 정상적으로 줄바꿈된 자료에 이 함수가 적용되어 2줄씩 띄어버리네요 ㅠ.ㅠ 

    Claude가 작성해준 코드는 아래와 같습니다.

    function decodeAndFormat(text) {
        // 이중 인코딩 문제 해결
        text = text.replace(/\\n/g, '\n');
        
        // HTML 엔티티 디코딩
        var textarea = document.createElement('textarea');
        textarea.innerHTML = text;
        text = textarea.value;
        
        // 각 줄의 시작과 끝에 있는 불필요한 공백 제거
        text = text.split('\n').map(line => line.trim()).join('\n');
        
        // Bold 처리: ** 로 둘러싸인 텍스트를 <strong> 태그로 변환
        text = text.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
        
        // 줄바꿈 처리: \n을 <br> 태그로 변환
        text = text.replace(/\n/g, '<br>');
        
        return text;
    }

    function applyFormatting() {
        var elements = document.querySelectorAll('.model_answer_details-content');
        elements.forEach(function(element) {
            var originalText = element.innerHTML;
            var formattedText = decodeAndFormat(originalText);
            element.innerHTML = formattedText;
        });
    }

    document.addEventListener('DOMContentLoaded', applyFormatting);

  • Lv5 Lv36
    처음부터 저장이 잘못되었네요. 줄바꿈된 상태로 저장되어야 하는데, 원본 DB에 문자 그대로 \n이 박혀 있으니 뭘 해도 그렇게 튀어나오지요. JSON을 확장변수에 집어넣는 과정에 문제가 있었던 모양입니다.

    일관성 없이 저장되었으니 동일한 변환 함수를 적용하더라도 어떤 자료는 정상적으로 나오고 어떤 자료는 두 줄씩 띄어서 나오는 것입니다. 정상적으로 저장된(변환이 필요없는) 자료와, 잘못 저장된(내용에 '\\n'이 포함된) 자료를 구분해서 처리해야 할 것 같습니다.

    클로드가 헛소리 하는 것은 무시합니다. PHP에서 잘못된 건데 왜 자꾸 JS를 뱉어내는 건지...
  • Lv36 Lv5
    네.. 다행히 markdown 형식으로 출력한게 많지는 않아서 찾아서 수동으로 고쳐주려구요. 앞으로는 json 출력 값을 html로 전환했다가 이걸 다시 text로 전환해서 확장변수로 저장하는 과정을 추가하면 문제가 없지 않을까나 하고 생각해보고 있습니다.

    답변 너무너무 감사합니다 ㅜ.ㅜ
  • Lv12

    형님들,

    php 에서 \n 을 다룰때는 쌍따옴표로 해야 한다 배웠습니다.

    맞습니까~?

  • Lv12 Lv36
    정말로 0x0A 개행문자를 매칭하고 싶은지, 아니면 백슬래시 문자와 소문자 n의 조합을 매칭하고 싶은지에 따라 다르겠지요.