PHP5.3以上で「文字列の検索」とその後にある文字を調べるプログラムを書いていただけると助かります。


http://test01.1811way.com/test02.html
で、
「かきくけこ」という文字があったら、次にある
「男」もしくは「女」のどちらかの文字を表示する。
というプログラムを書いていただけると助かります。

1.「かきくけこ」という文字があったら
2.それ以降の文字を検索し
3.「男」という文字があれば「男」と表示
  「女」という文字があれば「女」と表示
(ファイルの最後まで検索→表示)


という順番だと思います。

必要かどうかわかりませんが、
オブジェクト「simple_html_dom.php」を使っていただいて構いません。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/12/31 11:17:38
  • 終了:2013/01/05 18:00:47

ベストアンサー

id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202012/12/31 17:34:54

ポイント150pt

与えられた条件だと、下記のようになります。
UTF-8で保存し、実行してください。
URLのコンテンツのエンコードをmb_convert_encodingで自動変換していますが、うまく変換できない場合には、autoをコンテンツのエンコードに合わせてください。

<?php
$url = 'http://test01.1811way.com/test02.html';
$str = file_get_contents($url);
$str = mb_convert_encoding($str, 'utf-8', 'auto');

//検索
preg_match_all("/(かきくけこ).*?([男女])/umsi", $str, $arr, PREG_SET_ORDER);

//結果表示
foreach ($arr as $items) {
    echo "{$items[1]} => {$items[2]}<br />\n";
}
?>

ただし、これだと "かきくけこ区" の次の行に登場する "男" にもマッチしてしまいます。これでも良いでしょうか?

もし良くない場合は、"" がデータ区切りになっているという前提で書き換えたものが以下のスクリプトになります。

<?php
$url = 'http://test01.1811way.com/test02.html';
$str = file_get_contents($url);
$str = mb_convert_encoding($str, 'utf-8', 'auto');

//検索
preg_match_all("/(かきくけこ).*?([男女]).*?<\/tr>/umsi", $str, $arr, PREG_SET_ORDER);

//結果表示
//var_dump($arr);
foreach ($arr as $items) {
	echo "{$items[1]} => {$items[2]}<br />\n";
}
?>
id:kohhi

2パターン書いていただき、ありがとうございました。

2013/01/05 17:59:34

その他の回答(1件)

id:Cherenkov No.1

Cherenkov回答回数1502ベストアンサー獲得回数4922012/12/31 13:25:50

ポイント100pt

そのURL先をスクレイピングしたいという質問ですよね?
simple_html_domを使ったほうが簡単に抽象的な検索できるのでおすすめです。
サンプルを書きました。utf-8で保存してください。

  1. 文字コードを変換。
  2. 全てのtrを取ってきて2つ目のtdの中に「かきくけこ」を含む場合は4つ目のtdを表示する。utf-8の正規表現でチェック。
<?php
require_once 'simple_html_dom.php';
mb_language("Japanese");
header('Content-Type:text/html; charset=UTF-8');
$url = 'http://test01.1811way.com/test02.html';
$sorce = file_get_html($url);
//今回のターゲットはshift_jisなので文字コード変換。
$sorce = mb_convert_encoding($sorce, 'UTF-8', 'auto');
$dom = str_get_html($sorce);
foreach($dom->find('tr') as $element) {
  if (preg_match('/かきくけこ/u', $element->childNodes(1)->plaintext)) {
    echo $element->childNodes(3)->plaintext;
  }
}
id:kohhi

早速お返事いただきありがとうございました。

2013/01/05 18:00:15
id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202012/12/31 17:34:54ここでベストアンサー

ポイント150pt

与えられた条件だと、下記のようになります。
UTF-8で保存し、実行してください。
URLのコンテンツのエンコードをmb_convert_encodingで自動変換していますが、うまく変換できない場合には、autoをコンテンツのエンコードに合わせてください。

<?php
$url = 'http://test01.1811way.com/test02.html';
$str = file_get_contents($url);
$str = mb_convert_encoding($str, 'utf-8', 'auto');

//検索
preg_match_all("/(かきくけこ).*?([男女])/umsi", $str, $arr, PREG_SET_ORDER);

//結果表示
foreach ($arr as $items) {
    echo "{$items[1]} => {$items[2]}<br />\n";
}
?>

ただし、これだと "かきくけこ区" の次の行に登場する "男" にもマッチしてしまいます。これでも良いでしょうか?

もし良くない場合は、"" がデータ区切りになっているという前提で書き換えたものが以下のスクリプトになります。

<?php
$url = 'http://test01.1811way.com/test02.html';
$str = file_get_contents($url);
$str = mb_convert_encoding($str, 'utf-8', 'auto');

//検索
preg_match_all("/(かきくけこ).*?([男女]).*?<\/tr>/umsi", $str, $arr, PREG_SET_ORDER);

//結果表示
//var_dump($arr);
foreach ($arr as $items) {
	echo "{$items[1]} => {$items[2]}<br />\n";
}
?>
id:kohhi

2パターン書いていただき、ありがとうございました。

2013/01/05 17:59:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません