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

phpの正規表現で、
htmlソース内の「A」タグによるリンクを
urlencodeしたいと思っています。

初めのリンクだけや、最後の文字まで .+ で見て行ったりして、
なかなかうまくいきません。

htmlソース内のAタグのリンクを、
全てurlencodeする正規表現を実現するにあたって
アドバイス頂けると助かります。

●質問者: onigirin
●カテゴリ:ウェブ制作
✍キーワード:HTML PHP 「A」 アドバイス ソース
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Yota
●25ポイント

<?php

mb_regex_encoding("UTF-8") ;

$str = '<a href="http://こんにちは赤ちゃん.html">赤ちゃん</a>' ;

//$pattern = "<a href=.+([一-龠|ぁ-ん|ァ-ヴー]+)[^<]+>";

$pattern = "/(<a href=\"http:\/\/)([一-龠|ぁ-ん|ァ-ヴー]+)([^<]+>)/";

//mb_ereg ( $pattern, $str ,$regs ) ;

//print_r($regs) ;

preg_match_all($pattern,$str,$matches) ;

//print_r($matches[0]) ;

$replacement = '$1'. urlencode('$2') .'$3';

for($i = 0 ;$i < count($matches[0]) ;$i++ ) {

$matches_r[] = preg_replace($pattern,$replacement,$matches[0][$i]) ;

}

// print_r($matches_r);

echo str_replace($matches[0],$matches_r,$str) ;


?>

◎質問者からの返答

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

Aタグの開始と閉じる間に<B>等、

他のタグが入るとダメでした・・・。


2 ● tezcello
●50ポイント

過去の質問の続きの様なので、それらを織り込んでみました。

中途半端になっていたらゴメンナサイ。

// 後で使うので読み込み先のURLを変数に入れておく
$url0 = 'http://www.hatena.ne.jp/';
$html = file_get_contents($url0);

// 念の為、UTF-8に変換
$html = mb_convert_encoding($html, 'UTF-8', 'auto');
// スクリプト中にURLがある場合を考慮
$html = preg_replace('!<script.*?>.*?</script.*?>!is', '', $html) ;

// strip_tags() ではうまくいかなかったので、aタグのみを抜き出すようにしました
// リンクが文字列だけではなく、イメージの場合も考慮
// 冗長な所があるかもしれません
preg_match_all('/<a href=["\'](((https?:\/\/)?([^"\'?]*))((\?)([^"\']+))?)["\'][^>]*>(([^<]+)|((<img[^>]*src=")([^"\']+)("[^>]*>)))<\/a>/', $html, $res,PREG_SET_ORDER);

// var_dump($res);

foreach($res as $r){
 // URLが不完全な場合、先頭に追加する。
 // ただし、最初のURLがディレクトリまで含んでいる場合はもう少しチャンと対策する必要有り
 $url = preg_replace('/^\//', "$url0", $r[2]);
 if ($r[7]){
 // この中身を作っている所で力尽きましたごめんなさい。
 // 方向としては、$r[7]にパラメータ群が格納されているので、それぞれに分解し、
 // 必要な部分をエンコードして連結し直します。
 $encrd = urlencode($r[7]);
 $url .= '?'.$encrd;
 }

// 以下は不要かも知れませんが、リンクを示す文字列あるいは画像のURLを取り出します
 if ($r[9]){
 // 文字によるリンクの場合はその文字列が $r[9] に格納されている
 $itm = $r[9];
 }else{
 // 画像のURLは,$r[11]$r[12]$r[13] に分かれて格納されている
 $adr = preg_replace('/^\//', $url0, $r[12]);
 $itm = $r[11].$adr.$r[13];
 }
 // $lst に結果を格納します
 $lst[] = array('url'=>$encrd, 'itm'=>$itm);
}
◎質問者からの返答

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

<a href=xxx>なんた<B>ら</B>だよ</a>

というように、タグ間に、font等の別タグがあると、ダメでした・・・。

</a>でない言葉の連続、で試みようとしましたが、

http://www.kt.rim.or.jp/~kbk/regex/regex.html#CCLASS

ここを見ると、なかなか厳しいようですね・・・。

質問文で書き足りなかったのですが、

元のURLをurlencodeしたものに「置換」しようと思ってます。

preg_replaceだけで、頂いた正規表現でなんとかできないか頑張ってみましたが、

ちょっと今回は山が大きい感じです。。。


3 ● Yota
●25ポイント

<?php

$html = '<a href=http://konichiwa.com/こんにちは赤ちゃん.html>赤ちゃん<b>こんにちは</b></a><br/>' ;

$html .= '<a href=http://konnichiwa.akachian.com/hoge/赤ちゃんこんにちは.htm><b>こんにちは</b><b>赤ちゃん</b></a>' ;

$html .= '<br/><a href="http://konnichiwa.akachian.com/hoge/foo.html">foo</a>' ;

$pattern = "/(<a[^一-龠|ぁ-ん|ァ-ヴー]+)([一-龠|ぁ-ん|ァ-ヴー]+)([^>]*>)/e";

$replace = "'$1'. urlencode('$2') .'$3'";

echo preg_replace($pattern,$replace,$html) ;

?>

関連質問


●質問をもっと探す●



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