こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

同行のurlの片方にアンカーをつける正規表現

正規表現について、同じ行のurlの片方だけにアンカーをつけるには
http://hoge.jp/ http://hoge2.jp/
http://hoge3.jp/ http://hoge4.jp/
こういう行があったとして、
http://hoge.jp/ <a href="http://hoge2.jp/">http://hoge2.jp/</a>
http://hoge3.jp/ <a href="http://hoge4.jp/">http://hoge4.jp/</a>
こういう結果を得たいですが、可能でしょうか

投稿日時 - 2020-02-12 10:06:58

QNo.9711958

困ってます

質問者が選んだベストアンサー

$str = <<<EOF
http://hoge.jp/ http://hoge2.jp/
http://hoge3.jp/ http://hoge4.jp/
EOF;

$eg = '^(http://[^\s]+)\s+(http://[^\s]+)$';
$rp = '$1 <a href="$2">$2</a>';

~以上の様に変数等を設定した場合で…

$re = preg_replace( "#$eg#m", $rp, $str ); //PHP
$re =~ s#$eg#$rp#; //Perl
$re = $str.replace( $eg, $rp ); //Javascript

~大体、こんな感じで通るはずです。質問者が実際に置換処理を行う環境に基づいて適当に最適化してください。

P.S.
正規表現ではURLなどの文字列内部に / が含まれる場合を想定し、マッチング用の正規表現パターンを囲う左右両側の「区切り文字」に / だけではなく、空白文字以外の対になる記号文字なら何でも使用可能です(例文では # を使用)。

投稿日時 - 2020-02-13 01:33:50

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

「URLを、『http://』で始まり、コロンを含まない任意長の文字列とする」
「ただし、行末にあるもののみ置換対象」
と考えて、

s/(http:\/\/[^:]*)$/<a href="$1">$1<\/a>/;

これでいいですかね。
※OKWave上では円記号がバックスラッシュに表示されますがそのままコピペして下さい。V のように見えるのは「¥/」と書いた部分です)

なおperl上で実験したところ、行末の改行記号までURLに含んでしまったのか少々不自然になったので、直前にchop;を入れるか、

「URLにコロンと改行記号を含まない」として

s/(http:\/\/[^:\n]*)$/<a href="$1">$1<\/a>/;

にするのも良いかもしれません。
(テキストエディタの置換や、sed等では最初の通りで問題ない気がします)

置換したいものが「行末」ではなく「2番目」だったり、httpであったりなかったりするとまた書き方を変えないといけなくなってきますけど…。

投稿日時 - 2020-02-12 11:07:21