피터지고 치열하게 삶을 유지하다  
Front Page
Notice | Keyword | Tag | Location | Guestbook | Admin | Write Article   
 
2007/12/23에 해당하는 글 2건
2007/12/23   정규표현식 패턴 문법(PCRE 정규표현식 문법)
2007/12/23   IT상에서의 Seamless의 의미


정규표현식 패턴 문법(PCRE 정규표현식 문법)

그동안 Perl 스크립트에서 많이 보았지만 굳이 해석을 피해왔던 정규표현식 문법을 Wiki의 PHP Script 버그를 잡기 위해 드디어 보아야만 했다. ㅠ.ㅠ
정말 난해한 표현식이다. C의 scanf에서도 일부 사용되는 표현식이지만, 정말 알고싶지 않은 표현식이다.
하지만 어쩌겠는가?

PHP 매뉴얼을 참조하였다.
http://www.linuxinfor.com/korean/PHP-Manual/pcre.pattern.syntax.html

컥! 정규표현식이 생각만큼 그리 간단한게 아니었다. 정규표현식만 가지고도 책한권이 된다니.
PHP매뉴얼의 번역은 실로 정말 실망이다. 다른 책을 찾아봐야 겠당.
http://www.linuxfocus.org/Korean/July1998/article53.html
http://eldercrow.i-i.st/temptemp/regexp.htm

정규표현식에 관해서만 책으로 이루어진게 있었다. 하지만 바로 위 두개의 포스트에서 기본적인 정규표현식을 이해한 뒤 첫번째 포스트인 PHP 매뉴얼 부분을 보면 웬만한 표현식을 이해하는데 문제가 없을 것으로 생각된다.

문제는 HTML 내에서 다음과 같이 표현하였을 경우
[code]
<cli prompt="'" comment="$">
   test ' rpm -qa test $ test rpm
</cli>

<cli prompt='#'>
   test # rpm -qa test $ test rpm
</cli>

<cli comment='//'>
  test # rpm -qa test // test rpm
</cli>

<cli prompt="$" comment="#">
 user@host:~/somedir $ ls
 conf      lang         README        screen.gif  ui
 info.txt  manager.dat  renderer.php  syntax.php
 user@host:~/somedir $ wc info.txt # count words in info.txt
 55 108 1032 info.txt
 user@host:~/somedir $
 </cli>
[/code]

실제 아래와 같이 나타나도록 Parsing하는 PHP 코드에서 발생하였다.

사용자 삽입 이미지

다음은 말썽을 일으킨 PHP 코드의 부분이다.
[code]
    function _process_args($args) {
        // process args to CLI tag: sets $comment_str and $prompt_str
        $a_match = false;
        if ($args) {
           if (preg_match('/prompt\s*=\s*"([^"]*)"|\'([^\']*)\'/', $args, $matches)) {
                $this->prompt_str = $matches[1];
                $a_match = true;
            }
            if (preg_match('/comment\s*=\s*"([^"]*)"|\'([^\']*)\'/', $args, $matches)) {
                $this->comment_str = $matches[1];
                $a_match = true;
            }
        }
        return $a_match;
    }
[/code]

원본 코드는 정규표현식 /prompt\s*=\s*"([^"]*)"|\'([^\']*)\'/  에서 |(or)의 범위- (prompt\s*=\s*"([^"]*)" or  \'([^\']*)\')인가 또는 prompt\s*=\s* 를 제외한 부분인가? - 및 preg_match 함수의 사용법에 대한 오해에서 온듯한 결과로 보인다.

결론적으로 실제 예에서 prompt="#" comment='$' 이와 같이 사용하였을때  정규식 첫번째 ()로 묶인 표현식의 실예 "#"의 match 부분인 #은 matches[1]으로 리턴되지만 정규식 두번째 ()에 해당하는 실예 '$'는 matches[2]로 결과 $가 리턴된다는데 문제가 있다.

즉, 프로그래머의 의도와 달리 정규표현식에도 오류가 있지만 preg_match의 리턴값인 $matches 배열 사용에도 오류가 있다는 것이다.

다음의 코드를 시도해 보았다. (정규표현식 : /prompt\s*=\s*(["\'])([^\1]*)\1/)
[code]
    function _process_args($args) {
        // process args to CLI tag: sets $comment_str and $prompt_str
        $a_match = false;
        if ($args) {
            if (preg_match('/prompt\s*=\s*(["\'])([^\1]*)\1/', $args, $matches)) {
                $this->prompt_str = $matches[2];
                $a_match = true;
            }
            if (preg_match('/comment\s*=\s*(["\'])([^\1]*)\1/', $args, $matches)) {
                $this->comment_str = $matches[2];
                $a_match = true;
            }
        }
        return $a_match;
    }
[/code]

아쉽게도 정규표현식 []안에서 () 메모리 참조 표현인 \1를 사용할 수 없는 것으로 보인다.
그래서 위 코드는 정상 동작하지 않았다.

부득이 다음과 같이 수정하여 처음 프로그래머가 하고자 했던 의도를 완성해 보았다.
[code]
  function _process_args($args) {
        // process args to CLI tag: sets $comment_str and $prompt_str
        $a_match = false;
        if ($args) {
            //echo "args:".$args."<br>";
            if ($ret = preg_match('/prompt\s*=\s*("([^"]*)"|\'([^\']*)\')/', $args, $matches)) {
                $this->prompt_str = $matches[2];
                if($this->prompt_str == null)
                   $this->prompt_str = $matches[3];
                //echo "prompt($ret):".$this->prompt_str."<br>";
                $a_match = true;
            }
            //echo "args:".$args."<br>";
            if ($ret = preg_match('/comment\s*=\s*("([^"]*)"|\'([^\']*)\')/', $args, $matches)) {
                $this->comment_str = $matches[2];
                if($this->comment_str == null)
                   $this->comment_str = $matches[3];
                //echo "comment($ret):".$this->comment_str."<br>";
                $a_match = true;
            }
        }
        return $a_match;
    }
[/code]

^^ 이제는 정규표현식에 거부감을 갖지 않을 수 있을래나?!

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
Tag : 정규표현식
Track this back : http://www.codeforum.net/blog/pitoosung/trackback/130

name    password    homepage
 hidden


IT상에서의 Seamless의 의미
문화가 다르고 특히나 표의문자 보다는 표음문자를 쓰는 문화권의 글을 우리나라 말로 전달하는 것이 결코 쉬운일이 아니기 때문에, 번역을 아주 매끄럽게 해놓은 글을 보면 그 번역자가 새삼스레 존경스러워 지는 것이 사실이다.

오늘도 지식을 기록하는 과정에서 번역이 필요했고 다음과 같은 글에서 약간의 난관에 직면했다.

Trac allows wiki markup in issue descriptions and commit messages, creating links and seamless references between bugs, tasks, changesets, files and wiki pages.

seamless 사전적 의미로는 '이음새 없는' 이란 뜻이다. 도대체 seamless references라는게 무슨 뜻일까?
적절한 단어를 찾기위해 구글 신공을 발휘하다 찾은 글이 다음글이다.

IT상에서의 Seamless의 의미

위 글의 내용에 전적으로 공감되는바 다음과 같이 번역하여 보았다.

Trac은 이슈 Description과 Commit 메시지들, 링크의 생성 뿐만 아니라 버그, 태스크, Changeset, 파일, 위키 페이지들 사이의 일관된 참조(seamless references)생성에 wiki 구문이 사용될 수 있도록 하였다.

각각의 종류, 종속관계에 상관없이 똑같은 방법으로란 의미 전달이 적절할 것 같아 일관된 이란 단어를 사용해 보았지만 아직도 무언가 부족하다는 생각을 해본다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
Track this back : http://www.codeforum.net/blog/pitoosung/trackback/129

name    password    homepage
 hidden


BLOG main image
피투성의 IT 분투기
 Notice
(2009.11.30) - ㅠ.ㅠ 안녕! 서버 H/W 시스템 교체(서버보드 사망, HP Workstation으로 교체)
(2008.2.2) IP : 195.225.178.29 - 스팸 차단 조치
(2008.1.14) 오후 06:34 ~ 08:07 : 시스템 복구
(2008.1.14) 오전 00:25(?) : 시스템 다운 - 흠 심각하군!
(2008.1.13) 오후 11:31 : 시스템 리부팅됨
(2008.1.13) 시스템 복구 : 오전(?)~오후 1:00
 Category
전체 (148)
프로그래밍 (42)
IT 세상속으로 (42)
세상 엿보기 (26)
지하창고 (18)
책의 향기 (12)
생각의 힘(바둑) (4)
OCR-내가 다 읽어줄께 (1)
두발의 짐승 (2)
지능형 로봇 (1)
 Calendar
«   2007/12   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
 Recent Entries
투명 Display 그리고 Augm... (2)
64bits(x64) Windows OS...
NFS & Eclipse & CDT & In...
행복에 대해 생각하며
Virtual Audio Cable (가...
 Recent Comments
^^ 안녕! 축하축하. 난 아...
피투성 - 03/16
오랜만에들림니다 아이폰...
쭌 - 03/15
Thanks for your kind tra...
hyungju - 2009
정보 감사합니다 덕분에...
허수 - 2009
관리자만 볼 수 있는 댓글...
- 2009
 Recent Trackbacks
내가 생각하는 한의학의...
Life Is Always Emergency
FreeBSD 6.2, 64bit, 메모...
엘레노아의 작업로그
알약 백신 제대로 사용하...
촌철살인
유용한 블로그 툴 몇개..
ENTClic@blog...just anot...
국내의 검색엔진에 등록하...
케이알선의 이야기
 Archive
2010/01
2009/12
2009/07
2008/09
2008/03
 Link Site
00_피투성의 지식창고_00
 Visitor Statistics
Total : 70561
Today : 55
Yesterday : 46
텍스트큐브 배너
Eolin
rss