• 締切済み

PHP正規表現の特定文字列を省く場合

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

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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; ?>

junk1200
質問者

お礼

回答が遅れまして申し訳ございません。 $body = preg_replace("/((?<!\[double\])https?|ftp)(:\/\/[A-Za-z0-9\+\$\;\?\.%,!#~\*\/:@&=_\-]+)/", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $body); で出来ました!! 「先読み」と「戻り読み」ということについて初めて知りました。 問題解決&勉強になりました。本当にありがとうございました!!

関連するQ&A