기본적으로 php을 이용한 정규표현식에 대한 자동링크는 구글링을 하면 쉽게 찾아볼 수 있다.
XSS 공격을 막기 위해 php에서는 htmlspeicalchars이라는 메소드를 제공하게 된다. 이것을 쓰게 되면 XSS 공격을 쉽게 막을 수 있는 이점이 있다.
하지만 이 메소드는 스크립트 태그 뿐만이 아니라 모든 태그를 막아버리기 때문에 게시판 내용에서 URL 같은 것들을 링크를 달거나 색깔을 입힐 수 없게
된다. 혹시라도 htmlspecialchars을 썼다면 구글에 존재하는 어떠한 정규표현식도 제대로 안 먹힌거나 URL이 깔끔하게 링크가 되지 않는다.(결국엔 링크나
색깔도 태그를 써야하기 떄문이다.)
그렇다면 스크립트를 제외하고 몇몇 태그를 써야 한다는 상황이 올 때가 있다. strip_tags 라는 메소드를 가지고 일부 태그를 살리는 경우가 있지만 텍스트
로 이루어진 태그가 지워진다는 단점이 있게 된다. 간단하게 htmlspeicalchars 원리를 살펴보면 기존태그를 " &와 같은 걸로 replace 가 되는 원
리이다. html에서 겉으로는 정상적으로 보여도 저런 식으로 바껴지기 때문에 태그가 안 먹히게 된다.
이 htmlspeicalchars의 원리를 가지고 텍스트로 된 태그는 살리되 URL 링크를 다는 방법을 쓰고자 한다.
function autoLink($str) { $pattern = '/(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-]+)+(:[0-9]{2,4})?\/?'; $pattern .= '([\.~_0-9a-z-]+\/?)*'; $pattern .= '(\S+\.[_0-9a-z]+)?'; $pattern .= '(\?[_0-9a-z#%&=\-\+]+)*/i'; $replacement = '<a href="\\0" target="_blank">\\0</a>'; $str = str_replace('&','&', $str); $str = str_replace('"','"', $str); return preg_replace($pattern, $replacement, $str, -1); }
저 연속된 2개의 str_replace만 추가시키면 된다. 특수 문자 모두 변환을 하게 되면 html에서 스크립트가 먹어버리기 때문에 일부만 원형으로 변환한 상태에서 정규표현식을 사용하면 깔끔하게 URL이 링크 걸 수 있게 된다.
하지만 2가지 정도 유의사항이 있다.
첫번째로는 한글 URL이 들어가면 제대로 안된다는 것(추가를 시키면 "이 URL는 https://naver.com/한글입니다." 라는 문장에서 '~입니다' 까지 링크가 걸리게 된다.)
두번째로는 태그 문법이 틀려서도 안된다. 예를들면
<script src="http://www.google.com"></script> --> 이것은 되지만
<script src="http://www.google.com></script> --> 이 경우에는 깔끔하게 되지 않는다.
다시 말해서 정상적인 범주 안에서는 왠만큼 링크가 깔끔하게 들어가게 될 것이다.
'php' 카테고리의 다른 글
form에 대한 새로운 사실(?) (0) | 2019.09.05 |
---|