묻고답하기
게시글 본문에서 &/amp;와 &/nbsp;를 없애는 방법?
2014.09.04 12:55
관련 질문: 게시판(board)모듈에서 작성한 글의 글자수를 세는 방법을 찾습니다
게시판 모듈에서 작성한 글의 글자수를 세도록 다음과 같은 문구를 게시판 스킨에 넣었습니다.
{mb_strlen(strip_tags($oDocument->getContent(false)), "UTF-8")}
위와 같이 입력하지 정상적으로 글자수는 세어지지만, 예기치 못한 문제가 발생하였습니다.
&과 공백( )이 본문에 적혀 있으면 갑자기 글자수가 팍 올라가는 것입니다.
위지윅에디터에서 적고 글을 등록한 다음, 그 글을 수정할 때 html을 확인하면 다음과 같습니다.
이런 이유로 글자수를 셀 때에 앰프 표시는 다섯 글자, 공백 표시는 여섯 글자로 세어집니다.
문제 해결 방법으로 여러 가지를 떠올려봤습니다.
1. $oDocument->getContent(false) 에서 html을 제거한 후에 &/amp;는 &, &/nbsp;는 ' '로 치환해, 게시글 본문에서 &/amp;와 &/nbsp;를 없애고 뿌리게 한다. (지금 슬래시를 넣은 이유는, 저것을 빼고 이 게시판에 적으면 글 등록시 자동으로 &, ' '로 바뀌기 때문입니다)
2. 게시판 스킨이 아니라 에디터 스킨, 혹은 에디터 모듈 중에서 위와 같은 식으로 변형되는 문구를 제거한다.
3. mb_strlen에서 위 문구는 1로 계산하도록 한다.
아무래도 기본 textarea로는 사용자들이 답답하게 여겨서 위지윅에디터를 포기할 수 없다보니
점점 일이 복잡해지네요...
댓글 11
-
고코루리
2014.09.04 14:17
-
Novelic
2014.09.04 23:15
false에서 true로 바꾸어도 문제가 해결되지 않았습니다. 오히려 좀 더 이상하게 계산하네요... 여튼 답변 감사합니다.
-
고코루리
2014.09.04 23:46
단순히 본문 글자 수만 세는 건가요? 태그 수까지 세어야 하구요..ㅇㅅㅇ?
아무튼 두가지 예로 보여드리겠습니다.
태그를 제외하고 문자열 세기
mb_strlen(strip_tags($oDocument->variables['content']), "UTF-8");
태그를 포함하여 문자열 세기
mb_strlen($oDocument->variables['content'], "UTF-8");
원하는 글자수가 안나오는 이유는 다음과 같습니다.
getContent()로 불러올 경우 주석부터 시작해서 기본적으로 포함되는 코드가 들어가기 때문입니다.^^
(<!--~~~~~~~ --> <div class="xe_content"> ~~~~~~~~~~등등)
-
Novelic
2014.09.05 00:39
본문 글자 수만, 즉 태그를 제외하고 문자열 세기입니다.
여기서 '글자수'는 제가 본문에 적었던 식, '보이는 글자수'는 vareables['content']를 사용한 식입니다.
apple 사과 ←공백 포함해도 8자가 나와야 하는데 어느 쪽이든지 13으로 셉니다.
위지윅 에디터 상에서는 apple 사과지만
HTML 편집기 상에서는, html 태그 제외하고 공백이 &/nbsp;로 나오고 이걸 그대로 세어서 13이 됩니다.
게시글을 게시판에서 읽을 때에도 이렇게 표시가 되네요.
이건 해결하려면 애드온에서 문서 작성하고 등록하는 때에 &/nbsp; 혹은 <, >의 &/lt; 등등을 그대로 평문으로(?) 넘겨야 할 지도 모르겠네요. 잘은 모르겠지만...
-
고코루리
2014.09.05 01:56
저는 잘되는 것 같은데...
사용한 코드는
{mb_strlen(strip_tags($oDocument->variables['content']), "UTF-8");}
이것이고
테스트 링크 입니다. (limit time 3days);
참고로 당연히 공백을 포함합니다. 공백 포함이며 태그를 지우는 행위를 하다보면 자연스레 공백이 추가될 수 있습니다.
-
Novelic
2014.09.05 02:14
공백 뿐이 아니라 그 외에도 다른 HTML Entity들이 글자수 산정에 문제를 일으키는 것 같습니다. http://www.w3schools.com/html/html_entities.asp
-
고코루리
2014.09.05 02:25
다시 확인...
-
Novelic
2014.09.05 16:48
아, 세번째 방식으로는 의도하는 대로 글자수 산정이 되는군요. 어떻게 하신 건가요? +_+)
-
고코루리
2014.09.05 20:25
<등... 변환 함수는 인터넷에 돌아댕기는 걸 참고하였습니다.
확인하셨으면 댓글 다신 것 중에 테스트 링크는 지워주시길 요청드립니다.
{@ $search = array ("'<script[^>]*?>.*?</script>'si", // 자바 스크립트 제거 "'<[\/\!]*?[^<>]*?>'si", // HTML 태그 제거 "'([\r\n])[\s]+'", // 공백 제거 "'&(quot|#34);'i", // HTML 엔티티 치환 "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&#(\d+);'e"); // php로 실행 $replace = array ("", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(\\1)"); $text_len = preg_replace($search, $replace, $oDocument->variables['content']); } {mb_strlen(preg_replace("/(&([a-zA-Z]+)\;)|([\s\n\r]+)/","",$text_len), "UTF-8");}
-
Novelic
2014.09.05 20:49
멋지게 작동합니다. 많은 공부가 되었습니다. 감사합니다!
-
고코루리
2014.09.05 22:14
잘 작동한다니 다행입니다 ^^