人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpの正規表現について。

phpで、htmlの中のaタグによるリンクURLを取得しようとしていますが、うまくいきません。

例えば、aタグは

<a href="http://....">なんたら</a>
<a href=https:...>なんたら</a>
<a href="/nantara.html">なんたら</a>
<a href="/nantara/">なんたら</a>

など、様々なケースがあります。

この
href=●●の●●の部分のURLを取得して、
別の言葉▲▲を含めたURLに置換したいと思っています。


例えば、

<a href="http://hatena.ne.jp/">はてな</a>



<a href="http://ime.nu/http://hatena.ne.jp/">はてな</a>

のような感じにしたいと思っています。


preg_replaceで正規表現を使っていますが、
なかなか上手く動かないです。

上記を実現のために参考になるURLや、
function形式で参考コードをお願いします。

●質問者: onigirin
●カテゴリ:ウェブ制作
✍キーワード:href HTML PHP URL はてな
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Yota
●23ポイント

function replace_link($str) {

$pattern = '/(<a href=").+(">.+<\/a>)/';

$replacement = '$1http://ime.nu/http://hatena.ne.jp/$2';

return preg_replace($pattern,$replacement,$str) ;

}

◎質問者からの返答

どうもありがとうございます。

試してみたところ、htmlの一番最後にあるリンクだけ変換され、それ以外の文字情報などは全て消えてしまいました・・・。


2 ● wizemperor
●23ポイント

関数にするまでもないと思いますが一応しておきます。

function replace_href($html, $pre) {
$pattern = '/(<a(?:\s+?.+?)?\shref=["\'])((?:https?:\/\/|\/?\.+?).*?)(["\'](?:\s?.*?)?>)/';
$replace = '\1' . $pre . '\2\3';

return preg_replace($pattern, $replace, $html);
}

$htmlにHTMLを、$preに付け加えるURLを渡してください。

たとえば次のような感じです。

$html = replace_href('
<a href="http://hatena.ne.jp/">はてな</a>', 'http://ime.nu/');

この場合、$htmlには

<a href="http://ime.nu/http://hatena.ne.jp/">はてな</a>

が入ります。


3 ● wizemperor
●22ポイント

一部間違えました。

$pattern の部分は

$pattern = '/(<a(?:\s+?.+?)?\shref=["\'])(.*?)(["\'](?:\s?.*?)?>)/';

でよかったですね。

href属性の前後に他の属性が入っている場合や、シングルクォーテーションでもダブルクォーテーションでも対応できます。

◎質問者からの返答

どうもありがとうございます。

おおよそ無事変換されましたが、

htmlコード内にリンクが複数ある場合、

「変換される」「変換されない」「変換される」・・・と、リンクが1つおきに変換されてしまいました・・・。


4 ● GEN111
●100ポイント ベストアンサー

質問の意図を正しく解釈してないかもしれませんが。

function append_link($html, $appendix) {
 $html = preg_replace('#(<a\s[^>]*?href\s*=["])(?!http)#i', '$1http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['REQUEST_URI']), $html) ; // 相対アドレス
 return preg_replace('!(<a\s[^>]*?href\s*=["\']?)!i', "$1$appendix", $html) ;
}

$str = '
<a href="http://www.hatena.ne.jp">はてな</a>
<a href="https://www.yahoo.co.jp">やふー</a>
<a href="/hoge/">ほげ</a>
' ;

echo append_link($str, 'http://ime.nu/') ;
◎質問者からの返答

どうもありがとうございます。

無事変換されました!

正規表現は可能性が無限大ですね。

本当に助かりました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ