こんにちは。
<a
href="http://www.x**.com/test/product.php?id=1111&pid= …
TARGET=_blank>
<img border="0"
src="http://Y**.com/include/implession.php?pid=2222&h …
alt="テスト<BR>正規表現" width="100" height="75"></a>
などというタグから
リンク先のURLからhttp://をとったもの(ここでは、www.x**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444)
と
ソースURL(ここでは、http://Y**.com/include/implession.php?pid=2222&h …
を求めたいんですが、
どのように書けばいいのかわからなくて困っています。
どなたかわかりましたら、ご教授お願いいたします。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=909227
を参考にしてみましたが、この方法だと、TARGET=_blankなども入ってしまいます。
No.4ベストアンサー
- 回答日時:
こんにちは。
No2です。
先ほど、『単にURLを正規表現で取り出したい』という質問に受け取ってしまいました。申し訳ございませんでした。そういう意味では述べられている質問より高度(か、同一)です。
さて、私が前回の質問で言いたかったのは正規表現の使い方と意味です。
前回述べたのは答えではありませんでしたが、考え方をわかって頂かないと違うパターンになる度にこちらの質問に書き込まなければならず、非常に質問者さんにとっても効率の良いものではありません。
前回言った「自力で出来なければ」というのはそういう意味です。
で、本題です。
正規表現にマッチするパターンが質問内容しか例がないので、その範囲内、もしくはそれにプラスしたパターンでやります。
※それ以外については、保証の限りではありません。
そもそもタグの書き方が間違っている場合もあるでしょうし、URL自体に空白や改行を入れて書いている人もいるかもしれません。色々なパターンがあります(たとえばテーブルタグが崩れるのを防ぐためや、そもそもそのURLの先が自作のWebサーバや自作OSを使っているかもしれませんし)。
しかし、そういったパターンも考慮すると非常に大げさになってしまいます。
PHPやPerlの正規表現は非常に遅いので、大げさになればなるほどどんどん処理が遅くなります。
よって、URLであろう。もしくは、一般的なURLを対象するだけで十分でしょう。
細かい検証はしていませんが(片手間でつくったので思惑通りかどうか保証できません)、質問で言われている例、及び、以下のパターンで取り出す例を載せておきます。
(具体的な使用例を言って頂ければより正確になるでしょう。2chのような巨大な掲示板のページから取り出す。と、言うのであれば、PHPでやるべきか。と、いう問題にもなってきますし。)
-------------------------- ソース --------------------------------------
<?
/* リンク用のタグに使われているURLと
imgタグ用に使われているURL、
そして、その他のURL
を別の配列に入れる例。
*/
$str = <<<EOF
aaaaaaaa
<a href="http://www.a**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href ="http://www.b**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href = "http://www.c**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href = http://www.d**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href =
"http://www.e**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a
href="http://www.f**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href=
http://www.g**.com/test/product.php?id=1111&pid= …
TARGET=_blank>
これはただのアドレスhttp://www.H**.com/test/product.php?id=1111&pid= …
aaaahttp://www.H**.com/test/product.php?id=1111&pid= …ああああ
<img border="0"
src="http://imga**.com/include/implession.php?pid=222 … alt="テスト<BR>正規表現" width="100" height="75"></a>
<img src="http://imgb**.com/include/implession.php?pid=222 … alt="テスト<BR>正規表現" width="100" height="75"></a>
bbbbbb
EOF;
preg_match_all("/(\C{5,10})[\"]?https?:\/\/([^\"\s]+)/i" , $str , $arr);
//より正確にするなら以下を参考に
//preg_match_all("/(\C{5,10})[\"]?https?:\/\/([[:alnum:]\+\$\?\.%,!#~\*\/:@&=_\-]+)/i" , $str , $arr);
$linkUrl = array();
$imgUrl = array();
$etcUrl = array();
for ( $i = 0; $i < count($arr[1]); $i++){
if (stristr($arr[1][$i] , "href")){
$linkUrl[] = $arr[2][$i];
}else if (stristr($arr[1][$i] , "src")){
//httpのみにするか ftp や https その他に対応させることも可
//今回は http のみに対応ということで
$imgUrl[] = "http://" . $arr[2][$i];
}else{
$etcUrl[] = $arr[2][$i];
}
}
header("Content-Type: text/plain; ");
print "LinkっぽいURL<BR>\n";
print_r($linkUrl);
print "\n\n";
print "imgタグっぽいURL<BR>\n";
print_r($imgUrl);
print "\n\n";
print "その他のURL<BR>\n";
print_r($etcUrl);
?>
-------------------------- 実行結果 --------------------------------------
LinkっぽいURL<BR>
Array
(
[0] => www.a**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[1] => www.b**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[2] => www.c**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[3] => www.d**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[4] => www.e**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[5] => www.f**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[6] => www.g**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
)
imgタグっぽいURL<BR>
Array
(
[0] => http://imga**.com/include/implession.php?pid=222 …
[1] => http://imgb**.com/include/implession.php?pid=222 …
)
その他のURL<BR>
Array
(
[0] => www.H**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444
[1] => www.H**.com/test/product.php?id=1111&pid=2222&hid=3333&oid=4444ああああ
)
ありがとうございます。
私なりに解説サイトをみながらやってみたのですが、
なかなかうまくできなかったのですが、とても参考になりました。
おっしゃるとおり、これからはもっと自力でとけるようにしていきたいと思いますm(_ _)m
スクリプトとして実行してみましたが、すべて希望通りに動いてくれました!
リンク、画像だけでなくその他のURLも拾ってくれるので、すごく便利ですね。
このたびは、どうもありがとうございました。
No.3
- 回答日時:
preg_match_all("/(?:href|src)\s*=\s*(\".+?\"|\'.+?\'|[^\s>]+)\s*/is",$html,$matches,PREG_SET_ORDER);
でマッチしたものに、
preg_match("/^[a-zA-Z]+\:\/\/(.+)/s",$url,$matches);
※[a-zA-Z]+は[http|https|ftp…などなど]でも可。
をマッチさせるのが簡単かな。httpの部分はpreg_replaceで削除してもいいけど。
もちろん、これは完全じゃない。完全なURLマッチングは非常に難しい。
http://www.din.or.jp/~ohzaki/perl.htm#URI
さらにタグの内部にあるかどうかを知るのも難しい(上のやり方ではタグの内外、コメントの内外であるかどうかは不明)。
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
とにかく、一回のマッチで全てを求めようとしちゃいけない。あらかじめ、コメントやタグの外の部分を削除しておくとか。
少なくとも、No.2のやり方は「答え」じゃない。
ありがとうございます。
なるほど、少しずつ希望の形にしていくということですね。
試してみましたが
preg_match("/^[a-zA-Z]+\:\/\/(.+)/s",$url,$matches);
の行で、うまく検出されませんでした。
もちろん$urlをその前の行のマッチしたものにしてますが・・・
[a-zA-Z]を[http|https]にしたり
その後ろの+\:\/\/を:\/\/にしたんですが・・・
もっと勉強します!ありがとうございました。
No.2
- 回答日時:
こんにちは。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=909227
よりもやさしい部類ですよ。
これが自力で出来なければ、正規表現は一生マスターできません。
最初から一発でとは言いませんが、試行錯誤してやってみてください。
一応、答えを載せておきます。
「こういう場合は・・・」「こうしたいんだけれど・・・」という部分があれば、ご自分で色々試行錯誤してください。
------------ここから--------------------
<?
$str = <<<EOF
aaaaaaaa
<a href="http://www.x**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href="http://www.a**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href="http://www.b**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<a href="http://www.c**.com/test/product.php?id=1111&pid= … TARGET=_blank>
<img border="0"
src="http://Y**.com/include/implession.php?pid=2222&h …
alt="テスト<BR>正規表現" width="100" height="75"></a>
bbbbbb
EOF;
preg_match_all("/(https?:\/\/[^\"]+)/i" , $str , $arr);
print_r($arr);
?>
------------------------------------------
上を実行されるとわかると思いますが、取り出すときは
$arr[0][0]~$arr[0][最後の要素]
でアクセスできます。
$arr[0] と $arr[1]の違いは今回の場合は気にしなくていいでしょう。同じものをさしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPの変数で最初から2行分の文...
-
「クラス関数」「メンバ関数」...
-
onedrive にexcelファイルをア...
-
【file_exists】ファイルが存在...
-
ImageCreate関数が undefined f...
-
OpenGLで描いて画像ファイル出力
-
CSV出力にHTMLが入ってしまう
-
PHPのif文でその処理を途中で抜...
-
Fedoraでphp
-
別ファイルの変数を呼び出した...
-
フォントの色を変えるには?
-
「imagejpeg」(GD)で作成した...
-
エクスプローラーでフォルダを...
-
存在しないメールアドレスかど...
-
MySQLのdatetime型の月日0を削...
-
インスタンス化に伴うメモリ消...
-
phpにて動的なページを生成する...
-
.htaccessにphp_valueが使用できな
-
メール受信で空メール送信のプ...
-
httpdのプロセスが自動で消えな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
php 指定文字列以降の削除
-
^[a-zA-Z_][a-zA-Z0-9_]* でマ...
-
DIRECTORY_SEPARATORについて
-
PHPの正規表現 パターン修飾子...
-
PHPの変数で最初から2行分の文...
-
正規表現で3回目の単語の後に文...
-
PHPでurlから第4レベルドメイン...
-
メールアドレスチェックの方法
-
正規表現で一桁の数字を二桁に...
-
正規表現の「^」と「$」がうま...
-
正規表現でタグからURLを取り出...
-
PHPの正規表現で【】内を文字列...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
こちらはただの直列処理ですか?
-
別ファイルの変数を呼び出した...
-
PHP8を使うと、大量のWarningが...
-
トランザクションが原因?DBに...
-
form actionで二つ送信先を指定...
おすすめ情報