プロが教える店舗&オフィスのセキュリティ対策術

PHPを仕事で少し使用しております、Webデザイナーです。知識が少なく、正規表現での疑問がどうしても解決出来ずに困っております。限界を感じ質問させていただきました。どうぞよろしくお願いいたします。

PHPでURLにリンクを設定しております。文字列の中の「http」などで始まるURLにリンクを付けることは問題ないのですが、その中で「[nolink]http」といった特定の文字列が頭についているURLのみリンクを付けないようにしたいと考えております。ソースは以下の通りですが、上手くいきません。?!の個所を色々変えてみましたが、正しく認識されないorエラーが出てしまいます。

$body = preg_replace("/((?!\[nolink\])(https?|ftp)(:\/\/[A-Za-z0-9\+\$\;\?\.%,!#~\*\/:@&=_\-]+)/", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $body);

そもそもの考え方が間違っているのか、中途半端な知識のため解決の糸口がつかめません。どうぞご教授頂けますようお願いいたします。

A 回答 (1件)

PHPの戻り読み否定をつかってみては?


(?<!\[nolink\])

<?
$body=<<<eof
xxxftp://example.com/ <br>
xxxftp://www.example.com/hoge.htm <br>
xxxftp://www.example.com/hoge.htm?x=1&y=1 <br>
xxxhttp://example.com/ <br>
xxxhttp://www.example.com/hoge.htm <br>
xxxhttp://www.example.com/hoge.htm?x=1&y=1 <br>
xxx[nolink]http://example.com/ <br>
xxx[nolink]http://www.example.com/hoge.htm <br>
xxx[nolink]http://www.example.com/hoge.htm?x=1&y=1 <br>

eof;

$pattern="/((?<!\[nolink\])http:\/\/[\w\d\.\/\?\&=]+)/";
$replacement="<a href=\"\\1\" target=\"_blank\">\\1</a>";
$body = preg_replace(
$pattern,
$replacement,
$body);

print $body;
?>
    • good
    • 0
この回答へのお礼

回答が遅れまして申し訳ございません。

$body = preg_replace("/((?<!\[double\])https?|ftp)(:\/\/[A-Za-z0-9\+\$\;\?\.%,!#~\*\/:@&=_\-]+)/", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $body);

で出来ました!!

「先読み」と「戻り読み」ということについて初めて知りました。
問題解決&勉強になりました。本当にありがとうございました!!

お礼日時:2009/11/04 11:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!