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

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

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

4116閲覧

textファイルの中からhttpで始まる文字列があり、画像はimgタグで囲み、画像以外はaタグで囲む

sudoless

総合スコア8

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2015/09/17 03:05

編集2015/09/17 03:07

phpで実装を想定

例)

lang

1$text =' 画像URL: http://hoge.com/data/img/test.jpg 2 詳細URL: http://dev.foo.com/item_detail/5/ 3補足説明ほげほげ';

置換後イメージ

lang

1$replace_text ='画像URL: <img src = "http://hoge.com/data/img/test.jpg" > 2 詳細URL: <a href = "http://dev.foo.com/item_detail/5/" >http://dev.foo.com/item_detail/5/</a> 3補足説明ほげほげ';

未解決
この形で、imgタグで囲むのは出来ている、aタグの対応に困っている

lang

1$replace_text = preg_replace('/http:\S+\.jpg/', '<img src= "$0">', $text);

何かいい方法ないでしょうか。よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

php

1$replace_text = preg_replace_callback('/http:\S+/', function ($m) { 2 $url = $m[0]; 3 if (preg_match('/\.jpg$/', $url)) { 4 return "<img src=\"$url\">"; 5 } else { 6 return "<a href=\"$url\">$url</a>"; 7 } 8}, $text);

yuba さんの回答にコメントで突っ込んだのですが、次のように戻り読み言明 (?<! ... )と、独占的量指定子 ++ でもいけそうです。

php

1$text = preg_replace('/http:\S++(?<!\.jpg)/', '<a href="$0">$0</a>', $text); 2$text = preg_replace('/http:\S+\.jpg/', '<img src="$0">', $text);

あと、瑣末なことですが、jpg だけの置換で

php

1$text = 'http://hoge.com/data/img/test.jpg 2http://hoge.com/data/img/test.jpghoge 3http://hoge.com/data/img/test.jpg'; 4 5$text = preg_replace('/http:\S+\.jpg/', '<img src="$0">', $text); 6 7echo $text; 8/* 9<img src="http://hoge.com/data/img/test.jpg"> 10<img src="http://hoge.com/data/img/test.jpg">hoge 11<img src="http://hoge.com/data/img/test.jpg"> 12*/

などと .jpghoge みたいなのにも引っかかるので、次のように先読み言明をした方が良いかも。

php

1$text = 'http://hoge.com/data/img/test.jpg 2http://hoge.com/data/img/test.jpghoge 3http://hoge.com/data/img/test.jpg'; 4 5$text = preg_replace('/http:\S+\.jpg(?!\S)/', '<img src="$0">', $text); 6 7echo $text; 8/* 9<img src="http://hoge.com/data/img/test.jpg"> 10http://hoge.com/data/img/test.jpghoge 11<img src="http://hoge.com/data/img/test.jpg"> 12*/

投稿2015/09/17 04:02

編集2015/09/17 04:27
ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sudoless

2015/09/17 04:53

preg_replace_callbackをこうやって使うのですね、とても参考になりました。 ありがとうございます!!!
sudoless

2015/09/17 04:58

jpghogeも確かにその取りですね、とても参考になります。 ありがとうございます。
guest

0

.jpgで終わらないURL、という正規表現が書きたいわけですよね。
否定後読みを使います。
/http:\S+(?<!.jpg)/
で、まずURLにマッチさせてから、それが.jpgで終わっていないことという条件を追加できます。

投稿2015/09/17 03:20

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/09/17 04:28

あ、そっか。 別解としては単語境界 \b もありますね。 /http:\S+\b(?<!\.jpg)/
sudoless

2015/09/17 07:03

返答ありがとうございます。 参考になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問