정규식 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 :

[php] const와 define()

2014. 3. 9. 17:24 from Dev/php

php 5.3 이후로 상수를 정의하는 방법에는 두 가지가 있다. 5.3 이전에는 const는 글로벌로 이용할 수 없었다.

const를 이용하는  방법과 define을 이용하는 방법이 있으며, 다음과 같이 정의 내린다. 


const FOO = 'BAR';
define('FOO', 'BAR);

가장 근본적인 차이점은 const는 컴파일 타임에서, define은 런타임에서 정의가 내려진다는 점이다. 

따라서 const는 조건문에서 이용할 수가 없다. 즉, 미리 정의가 내려지지 않는 상수는 define을 이용해서 


if (!defined('FOO')) {
   define('FOO', 'BAR');
}

같은 방법이 가능하다. 

또한 당연히 const는 scalar값만 받을 수 있다. 


상수를 정의하는 이유에 충실하자면 const가 조금더 정확하고 퍼포먼스에서도 낫다고 본다. const를 이용하는 것이 상수가 많은 경우에는 두배 이상 코드를 더 빨리 해준다고도 한다. 

Posted by banasun :

variable variables, 변수명을 runtime에 지정

2014. 2. 14. 12:05 from Dev/php

내가 필요한 변수명을 런타임에 다른 변수값으로 결정한다.

"variable variables" 라는 것인데, 

여러가지 면에서 본다면 좋은 방법은 아니지만, 꼼수로 간혹 필요한 경우가 생길 수 있다.


<?php
$foo = "day1";
$$foo = "good morning.";    // $foo의 값인 $day1 변수의 값이 설정됨.
echo $day1;
?>
Posted by banasun :

php에서 SESSION에 object 저장하기

2014. 2. 13. 18:08 from Dev/php

가끔 DB에 넣고 꺼내고 하기 귀찮기도 하고, 유저가 작업하면서 수정한다거나 하는 일이 잦다면 DB에 넣었다 수정했다 지웠다 하느니 session에 넣어두었다가 다시 꺼내면 유용합니다. 

간단히는 인스턴스 자체를 그냥 serialize($obj) 로 했다가 다시 unserialize 해주는 거지요. 


인스턴스 A를 넣었다가 꺼내보겠습니다 :

<?php
// ... class 정의는 따로 있다고 칩니다 ...
session_start();
include('A.php');
// ...
$a = new A;
$_SESSION["myA"] = serialize($a);
?>


꺼낼 때는 :

<?php
session_start();
include('A.php');
if (isset($_SESSION["myA"]) {
   echo "A was found...";
   $a = unserialize($_SESSION["myA"]);
   var_dump($a);
} else {
   echo "A was not found in the session.";
}
?>


이러면 됩니다. 주의할 점은

  1. 당연히 session_start(); 가 되어야 하고,
  2. 꺼내고 넣고 할 클래스에 대한 정의가 양쪽 페이지에 다 있어야 합니다. 그렇지 않으면 SESSION 오류로 처리됨...

여기까지입니다. 


Posted by banasun :

php - mySql 한글 깨짐 현상

2014. 2. 12. 18:32 from Dev/php

간만에  php로 작업하다 보니 한글이 깨지네요. ㅡㅡ;;

제 서버도 아니라 설정을 바꾸고 어쩌고 할 수도 없고, PHP 버전이 낮아도 새로 깔수도 없고 해서 1시간 정도 헤매다 성공!!

이놈의 한글 문제는 십년 전이나 지금이나 변함이 없다는 게 참.. 미국서 태어났어야 하는 건가;;


PHP version 5.3.6 이전)

<?php

// ...

$dbh = new PDO($dsn, $user, $pw);

$dbh->exec("set names utf8");

// ...

?>

Posted by banasun :