質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.06%

  • PHP

    17240questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現での置き換えについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 235

enokiyo

score 60

ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$content);

をつかって自動リンクを設定したのですが、すでにタグが設定されている部分は何もしなくていい場合、どうすればよいでしょうか?

<img src="http://~">
<a href="http://~">あああ</a>

などにすでにタグが設定されているものが混在している場合です。

正規表現が苦手です・・・わかる方いましたらご教授お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • enokiyo

    2018/01/15 12:52

    質問削除依頼しても公開されたままだし、終わってるなぁ、このサイト・・・。吊るしてどうするの?

    キャンセル

  • enokiyo

    2018/01/23 04:26

    $content に対してリプレイスするのでhttp部分を自動リンクにする表記だけでは<a href="a href="~と入れ子になってしまいます。それを避ける方法があるかどうか教えていただきたいです。

    キャンセル

  • 退会済みユーザー

    2018/03/30 20:16

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

+1

正規表現置換後に入れ後にならないようにするのであれば、正規表現の言明機能を使って IMG,Aタグ以外のURL として正規表現を構築すれば可能かと思います。
http://php.net/manual/ja/regexp.reference.assertions.php

preg_replace()も同じPHPバージョンで使えるのでこちらを使うようにしてください。こちらの方がいろいろ使える機能が多く便利です。
http://php.net/manual/ja/function.ereg-replace.php

$contentがどのような構成で、どのような結果を得たいのかすべて把握できなかったので、とりあえず質問文にある IMG,Aタグを除くURL の正規表現を構築してあります。

//IMG,Aタグ付きリンク
$content1 = <<<EOS
<img src="https://teratail.storage.googleapis.com/uploads/avatars/26163/4835e311f77ce4df_thumbnail_32x32.jpg">
<a href="https://teratail.com/questions/106863">正規表現での置き換えについて</a>
EOS;

//普通のURL
$content2 = <<<EOS
https://teratail.com/questions/106863
EOS;

$regex   = '/(?<!\<img src="|\<a href=")((https?|ftp|news):\/\/[\w$.+!*\'(),{}\|\\~\[\]`<>\#%";\/?\^@&=-]+)/i';
$replace = '<a href="$1" target="_blank">$1</a>';

//IMG,Aタグ付きリンクを無視
echo preg_replace($regex, $replace, $content1);

//普通のURLはリンクにする
echo preg_replace($regex, $replace, $content2);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/23 16:22

    質問の意図を汲み取っていただきありがとうございます。ただ今回はpregではなくでして、書き方も多少かわってきます。

    やっぱ、できないのですかね?

    eregについては最初の方のご指摘の通りですし、あえてeregで聞いている理由を書かないとルール的にダメなのですかね??

    質問の意図も汲み取ってもらえずだったので、後に素人さんがみて非推奨コードをコピペしないように削除依頼も出したのですが…

    出来るかどうか知っていたら教えてほしいだと丸投げ扱いになるという…

    回答いただいてありがたいのですが、有料で非公開とかの機能をつけてもらえないかなぁ。

    キャンセル

  • 2018/01/23 17:08

    ereg系の正規表現はPOSIX拡張なので、Perl互換ではないだけです。eregでできてpregでできないことはありません。どうしても ereg_replace() でやりたい場合は、最初にマッチ条件などでIF文を書けば実現可能です。「HTMLタグがない場合」を正規表現ではなく、PHPのIF文で書くという意味です。
    POSIX拡張では先読みや後読みなどはできないはずです。(これら正規表現:?:, ?!, ?<=, ?<!)

    > 質問の意図も汲み取ってもらえずだったので、後に素人さんがみて非推奨コードをコピペしないように削除依頼も出したのですが…

    それだけなら「解決済み」すればいいだけかと思います。。。
    このサイトは、プログラマーのサポートサイトではないので、わかる人が知っていることを時間があって書き込みたいときに回答すれば良いだけで、その内容が間違っていても、ケチを付けたい人がケチを付け、回答をどの程度信用するかどうかは各閲覧者に任せられるべきかと思います。
    極論かもしれませんが、そこまで神経質にならなくても良いのではと思いましたので。

    キャンセル

  • 2018/01/23 20:43

    あーやはりできないのですね。

    if文での判定は実装済みですがもっとスマートにできないのかと思えた次第です。

    神経質というよりは質問の意図すらわからないのであればコメントしないでほしいなぁと前々から感じていたのですよね。

    質問を説明が長くならないようにシンプルにするのも苦労するので。

    また、このようなプロフェッショナルな回答は有料でもいいのできいてみたいです。

    ポイント稼ぎだけの方はいらないかなぁ。

    キャンセル

  • 2018/01/24 17:31 編集

    解決済みですが、いちおう追記しておきます。
    IF文ではなく、やり方を変えて「array_map() や array_filter()」を使用するという手もあるかもしれません。例えば下記のようなかんじです。
    ----
    //$array = array($content1, $content2,,,,) のような配列だとして
    $result = array_map(function($val) {
    //URLならAリンクにする
    if (preg_match('/^(https?|ftp|news):\/\/.+/i')) {
    return '<a href="'. $val .'" target="_blank">'. $val .'</a>';
    }
    return $val;
    }, $array);

    URLを複数のキーワードで成形する場合は「ereg_replace(), preg_replace()」は便利ですが、単純に文字列結合してるだけのようなので、正規表現は必要ないかと思います。

    キャンセル

+1

https://jex.im/regulex/
というページでチェックしながら、自分の思い通りの形にするのが良いかと。
自分もよく使います。(正規表現苦手な方なんで…)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17240questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。