[php] a href tag에서 url만 추출하고 <a> tag 제거

2014. 8. 11. 14:57 from Dev/php

며칠전에 포스팅한 글대로(정규식 Regular expression 이용한 url 추출) url을 처리하다 보니 기존의 컨텐츠에 <a href="..." ...> </a> 형식으로 들어간 링크와 충돌이 되기에 이번에는 <a> tag에서 url 부분만 추출하고 <a> tag를 날려 버리는 정규식이 필요하네요.

$content = preg_replace('#\S*#i', "\\1 ", $content);

이렇게 해주면 됩니다. ^^

Posted by banasun :

정규식 Regular expression 이용한 url 추출

2014. 8. 6. 04:03 from Dev/php

아주 옛날 cgi 짜던 시절(ㅋㅋ 나이 뽀록나겠네) Perl을 공부했던 때가 있었는데, 그때 정규표현식도 조금 봤었던 기억이 있네요. 시간이 흘러 얼마 전에 다시 필요해서 찾아보게 되었습니다. 

php에서 plain text로 입력을 받아서, 텍스트 안에 url이 있으면 a href를 생성해주는 일입니다.

그런데 예전이나 지금이나 url을 찾아내는 것은 난제네요. 

구글링 하다가 일목요연하게 비교 정리한 곳이 있어서 소개합니다. 

제목도 거창한 "In search of the perfect URL validation regex"  (http://mathiasbynens.be/demo/url-regex)!!!

저는 이 중에서 gruver v2 로 url이 있나 없나 체크한 후, 링크 걸어주기 전에 다시 filter_var로 검사하는 방식으로 구현해 보았습니다. 당장은 별 문제 없이 사용할 수 있을 것 같습니다.


$pattern = "#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'.,<>?«»‘’]))#iS";
if (preg_match_all($pattern, $content, $matches)) {
    foreach ($matches[0] as $match) {
        if (filter_var($match, FILTER_VALIDATE_URL)) {
            $link_url = "{$match}";
            $content = str_replace($match, $link_url, $content);			
        }
    }
}


Posted by banasun :