• 締切済み

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

  • 文字列全体に対する置き換え [正規表現]

    正規表現での文字列全体に対する、マッチ箇所 への置き換えについて、アドバイスをもらえないでしょうか。 parlでいうg修飾子はphpには無く、 例えば、[preg_match]は[preg_match_all]という関数で対応出来ますが、 置き換えを行う[preg_replace]には[preg_replace_all]がありません。 それに類する関数も無いように思います。 これに関して、PHPではどのように対応すれば良いのでしょうか。

    • ベストアンサー
    • PHP
  • PHPの正規表現で【】内を文字列ごと削除

    あいうえお【かきく】けこさ。【しすせそ】 といった感じの文字列を、【かきく】や【しすせそ】を削除して、 ”あいうえお けこさ。” としたいのですが・・・ $str = preg_replace("【.*】"," ",$str) とすると、 あいうえお ってなっちゃうし、 $str = preg_replace("/【.{1,5}?】/"," ",$str) とかやってみても上手く行かず。 はて?「/」は何を意味するのだろう。とか思いながら試行錯誤してはみてるのですが・・・ どなたかご教授くださいませんでしょうか。 お願いします。

    • ベストアンサー
    • PHP
  • phpでpreg_replaceで次のような条件の文字を置換したいのですが…

    <a href="jump?url= *1 " target="_blank"> *2 </a> というAタグになっている文字列を *2 だけのテキストにしたいと思っています。 preg_replaceでの正規表現での条件がわかりません…。

    • ベストアンサー
    • PHP
  • PHPでの正規表現

    PHPでの正規表現に関する質問です。 function makeAk($value){ return preg_replace("/(?<![一-龠+ぁ-ん+ァ-ヴ+a-zA-Z0-9'\"#@=:;])@([一-龠+ぁ-ん+ァ-ヴ+a-zA-Z0-9_]{1,15})/u", "@<a href=\"mypage.php/\\1\">\\1</a>", $value); } 上記のコードでmypage.phpに\\1ではなく、パラメーター(?id=$post['id']のような)を振りたいのですが、 どうしたらうまくいきますでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • エスケープ文字そのものにマッチさせる正規表現

     お世話になっております。  PHPの正規表現でエスケープ文字\そのものにマッチさせる正規表現がなかなか作れません。Perl互換のpreg_replaceなども試してみましたがダメでした。エスケープ文字そのものを削除したいのですが、どうしたらよいでしょうか? $value = ereg_replace ('\\', '', $value);//ダメでした。 $value = preg_replace ('/\\/', '', $value);//同様にダメでした。 $value = preg_replace ('/[\\]/', '', $value);//同様にダメでした。  文字列中に\が入っていたり、単独で\があった場合は必要ないので削除するといった感じです。 $value = ereg_replace ('[][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=]', '', $value); これでいけるかと思ったのですが、\だけ残ってしまいます。最後辺りの\\で\文字それ自体にマッチするかと思うんですが…。 わかる方がいらしたらおしえてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現について

    すみませんが、教えてください。 PHP+MYSQLで掲示板のようなサイトを作っています。 投稿したコメントの中にURLがある場合、次の変換で、リンクを設定するようにしています。 $str = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $aStr); さらに、次のことがしたいのですが、どうすれば良いのか教えてください。 (1)URLが長い場合、表示する文字列を指定文字数でカットする。 (2)URLのみをリンク設定付で切り出す。 当方、正規表現がほとんど理解できていません。 (オイラリーの本を買ったのですが、時間がなくて学習できていません。) 申し訳ございませんが、こうすれば良いというコードを教えていただければ、幸いです。

    • ベストアンサー
    • PHP
  • php内 正規表現で特定文字を削除したい

    phpの正規表現での置き換えに関しまして、ご質問をさせて頂きます。 宜しくお願い致します。 utf8のphp内で、 以下のような文字列(例1、例2)を$urlに入れて、<?php $url_regex = preg_replace('ホニャララ' , '' , $url) ;?>で、$url_regexに統一した出力結果をえたいと考えています。 例1) $url = /jhk/3つ目がとおる.html $url = /jhk/21-3つ目がとおる/呪文.html/ $url = /jhk/21-3つ目がとおる/呪文/ホアカバリキルマ.html ↓ いずれも $url_regex = /jhk/3つ目がとおる.html 例2) $url = /jhk/ドラクエ.html $url = /jhk/34-ドラクエ/呪文.html/ $url = /jhk/34-ドラクエ/呪文/イオナズン.html ↓ いずれも $url_regex = /jhk/ドラクエ.html この場合、正規表現'ホニャララ'はどのような記述にすれば良いか分からずに困っています。 また、この方法で置き換えは可能なのか否かも不明です。 詳しい方がいらしゃいましたら、ご教示、アドバイスいただければ幸いです!

    • ベストアンサー
    • PHP
  • PHPの正規表現による文字列置換について

    下記のような文字列から「abcde」のみを変数に格納したいのですが、正規表現に苦戦しています。 http://example.com/detail.php?p=abcde.php 取得したい「abcde」のみが毎回変わり、その前後は固定です。 preg_replace()を使うのがいいのだろうなと思い、いろいろやってみているのですが、 なかなかマッチさせることができません。 どうかご教示頂けますでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現で文字列の抜き出し

    PHP4で、文字列の中からマッチしたものを抜き出したいのですが、なかなか上手いこといきません。 $str = "<a href=http://www.abc.com/><b>ABC</b>company</a>"; preg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg); http://www.abc.com/ と <b>ABC</b>company の2つを抜き出したいのですが、 <b>タグが邪魔をして抜き出せません。 どうすれば上記2つを抜き出せるのでしょうか?

    • ベストアンサー
    • PHP
  • 基礎で恐縮です。PHPで文字列を抽出

    PHP Version 5.2.14 です。 $foo = '/HUB.php/★'; という文字列があり、ここから、★の部分だけを取り出し、$bar に代入するにはどうすればいいのでしょうか? 例) $foo = '/HUB/a=dfnjgdbnnfjbkndzjnkbldjteznjhkbtkdkgld/g?h=1?g=2&q=5'; ならば、 $bar = 'a=dfnjgdbnnfjbkndzjnkbldjteznjhkbtkdkgld/g?h=1?g=2&q=5'; を取得したいです。 (★の中に「HUB」という文字列が出てくる可能性もあります) preg_match か preg_replaceを使えばよさそうだということはわかるのですがうまくいかず。。。 補足 すみません、上の例で、 $bar = 'a=dfnjgdbnnfjbkndzjnkbldjteznjhkbtkdkgld/g?h=1?g=2&q=5'; を取得したあと、 一番最初にでてくる「?」より左の文字列を、$hogeに、 一番最初にでてくる「?」より右の文字列を、$fugaに、 代入する方法もお教えいただけますでしょうか? 希望) $hoge = 'a=dfnjgdbnnfjbkndzjnkbldjteznjhkbtkdkgld/g'; $fuga = 'h=1?g=2&q=5'; よろしくお願い申し上げます。

    • ベストアンサー
    • PHP