1

주제: 정규 표현식 고수님들께 도움을 요청합니다.

안녕하세요.

제가 태터툴즈의 포스트에 참조 링크가 걸려 있으면 링크 오른쪽에 아이콘을 표시하고 링크는 새창으로 열리도록 하기 위해 플러그인을 제작하고 있습니다.

소스는 다음과 같습니다.

function link($target) {
        $pattern = "/(<a[^>]*href=['\"]*([^'\"]+)['\"]*[^>]*>([^<]+)<\/a>?)/";
        $target = preg_replace($pattern, "<a href=\"\\2\" target=\"_blank\">\\3<img src=\"./images/newwindow.gif\" style=\"margin-left:0.1em; margin-right:0.1em; vertical-align:middle;\" alt=\"HyperLink\"></a>", $str);
        return $target;
    }

그런데 이 함수가

<a href="주소">어쩌구 저쩌구 재잘재잘</a>

와 같은 형식으로 되어 있으면 제대로 동작합니다. 하지만,

<a href="주소">어쩌구 <span style="color:#000000;">저쩌구</span> 재잘재잘</a>

이렇게 보다시피 <a></a> 태그 중간에 <span> 과 같은 코드가 들어가 버리면 위에서 작성한 link 함수가 동작하지 않습니다.

웹에서 정규식 메뉴얼들을 찾아서 이리저리 수정해 보고는 있습니다만, 잘 안되더군요.. ㅠㅠ

그래서 정규식 고수분들께 도움을 요청드립니다. 어떻게 하면 좋을까요?

Tyburn (2007-01-27 18:28:16)에 의해 마지막으로 수정

2

답글: 정규 표현식 고수님들께 도움을 요청합니다.

굳이 </a>까지 찾을 필요가 없지 않을까요?

3

답글: 정규 표현식 고수님들께 도움을 요청합니다.

네...
<a href="...."> 에서 <a href=" 부터 "> 정도 까지만 찾으셔도 될듯 싶습니다...
아니면 href= ~ > 까지만 해도 충분할듯 싶습니다.

4

답글: 정규 표현식 고수님들께 도움을 요청합니다.

$pattern = "/(<a[^>]*href=['\"]*([^'\"]+)['\"]*[^>]*>(.+?)<\/a>?)/";

로 바꾸시면 될 것 같습니다. (.+?) 는 최소 매치를 수행하므로, 한 줄에 여러 a 태그가 나와도 최소한의 매치만 하므로 원하는 값이 나옵니다.

그리고, 아래는 \\3 을 없애고 \\0을 맨 앞에 넣은 것인데, 이것이 의도한 것 아니었나요?

    $target = preg_replace($pattern, "\\0<a href=\"\\2\" target=\"_blank\"><img src=\"./images/newwindow.gif\" style=\"margin-left:0
.1em; margin-right:0.1em; vertical-align:middle;\" alt=\"HyperLink\"></a>", $target);

5

답글: 정규 표현식 고수님들께 도움을 요청합니다.

아 그리고, 함수 link는 linux, unix 쪽에서 사용되는 것이므로 다른 이름으로 바꿔야할 듯합니다.

6

답글: 정규 표현식 고수님들께 도움을 요청합니다.

도움에 감사드립니다.

모두들 평안한 하루 보내시길... ^^