before_display_content 시점에 호출되는 기존의 애드온을 보면,

대개의 경우 출력 소스가 본문의 주석문(BeforeDocument, AfterDocument) 주변을 치환해서 나오곤 합니다.

 

그런데 애드온에서 (게시판 스킨을 안정적으로 유지한다면) 본문 내부의 특정 클래스 이름을 가지는 요소 주변으로도 출력 소스를 치환해서 보여줄 수가 있겠더군요.

관련한 정규식을 검색 및 짜깁기하는 게 쉽진 않았지만, 유용한 패턴이겠다 싶어 공유해보고자 합니다.

 

만약 클래스 이름을 애드온 옵션에서 지정받아온다면(이 경우에는 $addon_info->position입니다), 패턴을 다음과 같이 짜볼 수 있겠습니다.

$pattern = '/<(\w+)[^>]*class=("|\')[^"\']*\b' . $addon_info->position . '\b[^"\']*\2[^>]*>.*?<\/\1>/is';

$addon_info->position에 입력된 문자열과 같은 클래스 이름을 가진 요소를 찾아주는 패턴입니다.

 

$tpl은 출력될 html 소스인데요.

$output = preg_replace($pattern, $tpl . '$0', $output);

이렇게 하면 해당 요소 앞 부분에 $tpl이 출력되고,

 

$output = preg_replace($pattern, '$0' . $tpl, $output);

이렇게 하면 해당 요소 뒷 부분에 $tpl이 출력됩니다.

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile
    오... 팁 좋습니다. 저는 애드온에 치환자로 사용할 키워드를 직접 하드코딩해서 위치를 조절해서 출력하는데 이렇게 하면 설정에서 수시로 바꿀수 있군요~
  • profile profile
    요소 앞이냐 뒤냐도 옵션을 주면 더 편하더라구요ㅎ
  • ?
    작은 따옴표(Single Quote) 대응이 안되어있네요..!

    HTML에 작은따옴표 쓰시는 분이 많이 계시더군요.
    저는 처음 배울때 큰따옴표로 배워서 계속 그렇게 쓰고 있지만요..
  • ? profile
    힝, 설마요;;; 현존 게시판 스킨 중 작은 따옴표 쓰는 건 못 봤는데ㄷㄷㄷ
  • profile ?
    그러고보니 배포중인 게시판 중에서는 저도 본적이 없네요. 레이아웃 중에서는 몇개 본 것 같습니다.
    제가 언급한건... 음... 개발자분들 중에서...? 의외로 많다....?

    HTML에 작은따옴표 쓰시는 분이 '의외로' 많이 계시더군요.
    로 수정하겠습니다ㅋㅋ
  • ? profile
    하긴 레이아웃 요소에도 적용될 수 있으니 감안을 해야겠네요.
    작은따옴표도 적용해봤습니다. 코멘트 감사합니다~

    정규식은 어려워요;;;
    뭔가 투 머치한 것 같은데 나중에 어떻게 match될 수도 있으니까 그냥 방치해두렵니다 흠흠..
  • profile ?

    이제 class="example-'error" 같은 경우도 고려해야겠군요ㅋㅋㅋ

     

    HTML 문자열을 정규식으로 처리하는게 쉽지 않죠.
    문법이 있기는 하더라도, 정확한 형태가 정해진게 아니라서 더욱 복잡하구요ㅠㅠ

  • ? profile
    헐 정말로 그런 클래스 이름도 있어요? 이건 너무하잖아요ㅜㅜ
  • profile ?
    안타깝지만 없어요...!ㅠㅠ
  • ? profile

    농락당해버렸다... 46_sv.gif

  • profile

    아, 이거 div 안에 다른 div가 있을 경우엔 문제가 있는 팁이네요;;; 다른 방도를 알아봐야겠습니다.

  • profile profile

    주어진 태그 바로 안쪽이나, 직전에 넣는다면 괜찮습니다.

    그 밖의 위치에 넣으려면 다른 클래스로 선택하도록 하는 편이 나을 거예요.

     

    이미 만들어진 HTML 태그를 가장 완벽하게 다룰 수 있는 것은 PHP가 아니라 JS지요.
    덕분에 아래와 같은 꼼수도 가능합니다 ㅎㅎ


    $output .= '<script> jQuery(".' . $addon_info->position . '").append(' . json_encode($tpl) . '); </script>';


    삽입할 위치는 append, prepend, after, before 등으로 선택 가능하고요.

  • profile profile
    js가 깔끔하게 잘 되긴 하는데, 로딩할 때의 지연이 있는 게 영 마음에 걸려요.
    말씀하신대로 태그 직전이나 안쪽에 들어가는 걸로 만족해야 할지도 모르겠습니다.
    DOMDocument는 일만 커질 테니 피해야겠죠?
  • profile profile
    네... PHP에서 HTML을 파싱하려고 하지는 마세요 ㅜㅜ