任意のウェブサイトから特定の範囲間を取得したいと思い、何らかの正規表現を用いれば出来るのではと思ったのですが、どのようにすればできるのか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。

なお、抽出したい範囲の例としては下記となります。

例1
<body>
※この中を抽出したいです。
</body>

例2
<!--抽出開始-->
※この中を抽出したいです。
<!--抽出終了-->

以上、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

XMLをパースしたいならそれ用のパーサーを利用するのが早いです。


単純に文字列として抜き出したいなら正規表現でこんな感じ
(ただしutf以外では正しく抜き出せない可能性が高いです)

<?PHP
$str=<<<eof
例1
<body>
test1
※この中を抽出したいです。
test2
</body>

例2
<!--抽出開始-->
test3
※この中を抽出したいです。
test4
<!--抽出終了-->
eof;


$pattern1="/(?<=<body>).*?(?=<\/body>)/misu";
if(preg_match($pattern1,$str,$match)) print "結果1:<br>".nl2br(htmlspecialchars($match[0]));

$pattern1="/(?<=<!--抽出開始-->).*?(?=<!--抽出終了-->)/misu";
if(preg_match($pattern1,$str,$match)) print "結果2:<br>".nl2br(htmlspecialchars($match[0]));

?>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教示いただいたソースを試したところ、意図した動作となりました。

それと、行いたい事はyambejpさんが下記の質問でご回答された内容と似たような感じだったため、リンク先のソースと今回ご教示いただいたソースから、下記のソースを基にカスタマイズすればやりたい事が出来ると思います。
http://oshiete.goo.ne.jp/qa/3636057.html

なお、読み込みたいhtmlは自分が作成したもので、文字コードはUTF-8の為、UTFで動作すれば大丈夫です。

<?php
ob_start();
include 'http://www.example.com/index.html';
$hoge=ob_get_contents();
ob_end_clean();

$pattern1="/(?<=<body>).*?(?=<\/body>)/misu";
if(preg_match($pattern1,$hoge,$match)) print "結果1:<br>".nl2br(htmlspecialchars($match[0]));
?>

このたびはどうもありがとうございました。
以上、よろしくお願いします。

お礼日時:2011/04/25 11:59

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Qincludeで読み込んだ内容を変数にいれたい

includeで読み込んだファイル内容を変数に格納する方法はありますか?

動的ページをHTMLファイルで出力したいと思っています。

例:

if(!file_exists("$file")){
mkdir("$file",0755);
}
$fp = fopen("$file/index.html","w")
flock($fp, LOCK_EX);

$hoge = include("./hoge.php");

fputs($fp,'<html>'."\n");
fputs($fp,'$hoge'."\n");
fputs($fp,'</html>'."\n");

この様に、$hogeの中に読み込んだファイルを書き込みたいのですが、
うまくできません。

この様な方法で変数にいれるのは可能でしょうか?

宜しくお願いします。

Aベストアンサー

出力のバッファリングですね・・・
こんな風にやります。

<?PHP
ob_start();
include("hoge.php");
$hoge=ob_get_contents();
ob_end_clean();
print $hoge;
?>

ちなみに変数をシングルコーテーションでくくってはいけません

Q正規表現で複数行に渡る範囲を取り出す

<html>

<div></div>

<div class="content">
<b>内容<b/><br />
<img src="#" />
<p>ほげほげほげほげ</p>
</div>

<div></div>

</html>

上のようなHTMLがあるとします。<div>の前後にもhtmlは書かれています。
そこから正規表現で<div class="content">~~~</div>の中身を取り出したいのですが、できません。
言語はPHPで、

/<div class=\"content\">.*<\/div>/
と書いてみたんですが、改行などがありうまくいきませんでした。

どのようにに記述すればうまくいくんでしょうか。

Aベストアンサー

> preg_match(/<div class=\"content\">.*<\/div>/s),$target);
> と書いて、divの中身を取り出すことはできたのですが、
> <div class="content">の対の</div>ではなく、html文中にある一番最後の</div>が対象になってしまいました。
* だと最長一致なので
代わりに最短一致の *? を使ってみてはどうでしょう。

(/<div class=\"content\">.*?<\/div>/s

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qpreg_match関数で正規表現の複数指定方法。

./aaaディレクトリ内においてファイル名に、『bbbb』及び『cccc』と言う文字列が含まれるファイルを./eeeディレクトリに移動させるスクリプトを考えております。

以下は『bbbb』のみを拾うようなスクリプトです。
=========
<?PHP
if ($dir = opendir("./aaa")) {
while (($file = readdir($dir)) !== false) {
if(preg_match("/bbbb/",$file)) rename("./aaa/".$file,"./eee/".$file);
}
closedir($dir);
}
?>
=========
上記は前にこちらで質問させていただき、正常に動くことを確認しております。
今回は『bbbb』及び『cccc』が含まれる場合に./eeeディレクトリに移動させることを考えております。
このような場合は『cccc』はどのよう記載すればよいのでしょうか?ご教授の程よろしくお願いいたします。

Aベストアンサー

どちらとも含まれる場合と言う意味ですよね?

単に preg_match をもう一回やればいいのではないかと。

if(preg_match("/bbbb/",$file)) {
if(preg_match("/cccc/",$file)) {
rename("./aaa/".$file,"./eee/".$file);
}
}

Qcsvの特定のキーワードを指定して、そのキーワードを含む行を表示させる方法

こんにちは。いつも参考にさせてもらっています。

さて、下記のコードはcsvのデータをphpにて読み込み、各項目ごとに分割をして、指定した行のみをtableに表示させているのですが、実際は行を指定するのではなく、特定のキーワードを指定し、その指定したキーワードの行をtable上に表示させたいのです。
自分なりに調べてみたのですが、うまくいかない理由がわからなかったので今回投稿させて頂きました。
よろしくお願い致します。

<?php
$openfile = file_get_contents('sq-tyo.csv');
$csv_gyo = split("\n", $openfile);

echo "<div>";
list($from, $class, $to, $type1, $type2, $kikan) = split(",", $csv_gyo[0]);//1行目

echo "<table>";
echo "<tr>";
echo "<td>";
echo "<b>出発地</b>";
echo "</td>";
echo "<td>".$from."</td>";
echo "<td>";
echo "<b>座席クラス</b>";
echo "</td>";
echo "<td>".$class."</td>";
echo "</tr>";
echo "<tr>";
echo "<td>";
echo "<b>目的地</b>";
echo "</td>";
echo "<td>".$to."</td>";
echo "<td>";
echo "<b>種類</b>";
echo "</td>";
echo "<td>".$type1."</td>";
echo "</tr>";
echo "<tr>";
echo "<td>";
echo "<b>経路</b>";
echo "</td>";
echo "<td>".$type2."</td>";
echo "<td>";
echo "<b>期間</b>";
echo "</td>";
echo "<td>".$kikan."</td>";
echo "</tr>";
echo "</table>";
?>

本当はデータベースを使用したいのですが、今回はcsv使用のみと言われてしまったので、ご協力をお願いいたします。

こんにちは。いつも参考にさせてもらっています。

さて、下記のコードはcsvのデータをphpにて読み込み、各項目ごとに分割をして、指定した行のみをtableに表示させているのですが、実際は行を指定するのではなく、特定のキーワードを指定し、その指定したキーワードの行をtable上に表示させたいのです。
自分なりに調べてみたのですが、うまくいかない理由がわからなかったので今回投稿させて頂きました。
よろしくお願い致します。

<?php
$openfile = file_get_contents('sq-tyo.csv');
$csv...続きを読む

Aベストアンサー

なるほどです

となると、やはりtany180sxさんのやり方になります

//キーワードを取得
$keyword = $_GET['keyword'];

//先にテーブルのヘッダー行を書き出します
//省略

//ここから検索&該当行の書き出し
foreach ($csv_gyo as $key => $val) {
  //ここでmb_strpos関数でCSVの行を検索しています
  if (mb_strpos($val, $keyword) === false) {
    continue;//キーワードが見つからない場合はループをひとつ飛ばして次の行へ
  }
  //キーワードが見つかった場合のみ以下のコードが実行されます
  list($from, $class, $to, $type1, $type2, $kikan) = split(",", $val);

  //ここにテーブルを書き出すコードを書きます
  echo '<tr>';
  //省略
  echo '</tr>';
}
//テーブルを閉じます
echo '</table>';


検索のところは
CSV行のなかに$keywordがあるかどうかをチェックするだけです

検索方法は正規表現を使用するなど、いくつか方法はあります。
"php 文字列 検索" 等で検索すればやり方がいくつか見つかると思います。

上記のコードでうまく検索できない場合は、
日本語を含んでいますのでPHPの文字コードとCSVの文字コードが異なっている
可能性が考えられます。
その場合は、文字コードを統一するか
検索時にキーワードとCSV行の文字コードをmb_convert_encodingで合わせるとか…

なるほどです

となると、やはりtany180sxさんのやり方になります

//キーワードを取得
$keyword = $_GET['keyword'];

//先にテーブルのヘッダー行を書き出します
//省略

//ここから検索&該当行の書き出し
foreach ($csv_gyo as $key => $val) {
  //ここでmb_strpos関数でCSVの行を検索しています
  if (mb_strpos($val, $keyword) === false) {
    continue;//キーワードが見つからない場合はループをひとつ飛ばして次の行へ
  }
  //キーワードが見つかった場合のみ以下のコー...続きを読む

Qinclude先でのinclude元の変数について

度々お世話になっています。
include先でのinclude元の変数の扱いについて疑問に思ったので質問させて下さい。
include元ファイルtest.php include先ファイルinclude.phpとしてtest.php内の変数をinclude.phpに渡したいと考え以下のコードを書きました。

test.php
<?php
$test = "いけるかな?";
include "include.php";
?>

include.php
<?php
echo $test;
?>

結果、$testの値を表示する事が出来なかったのですが、$testの値を表示するためにはどのような記述方法があるのでしょうか?
また、このような動作を期待している理由としてはPHP部分とHTMLを分離させたいと考えており、ユーザ定義関数に変数を引数として渡して、出力処理をユーザ定義関数内で行うという事も考えたのですが、include先に値を渡す事が出来れば、非常にわかりやすく分離出来ると考えたからです。

他に、PHP部分とHTML部分をファイル分けするやり方などありましたら教えて頂けますとうれしいです。

度々お世話になっています。
include先でのinclude元の変数の扱いについて疑問に思ったので質問させて下さい。
include元ファイルtest.php include先ファイルinclude.phpとしてtest.php内の変数をinclude.phpに渡したいと考え以下のコードを書きました。

test.php
<?php
$test = "いけるかな?";
include "include.php";
?>

include.php
<?php
echo $test;
?>

結果、$testの値を表示する事が出来なかったのですが、$testの値を表示するためにはどのような記述方法があるのでしょうか?
また、...続きを読む

Aベストアンサー

>変数$aはインクルードされた b.inc スクリプトの中でも利用可能です。
<?php
$a = 1;
include 'b.inc';
?>

問題なさそうに見えますけど、記述ミスとかありませんか?
先頭に
ini_set('display_errors', 1);
error_reporting(E_ALL);
としたら何か表示されますか?

include は割と自由度が高いので失敗すると余計分かりにくくなりますが
ロジックと出力の分離としては基本的な設計と思います。
この構成に、View(HTML)用の値を格納する箱(オブジェクト等)を作り、
Viewはその箱の値を操作するようにする、とかやっていけば
いわゆるMVCモデリングに近づきます。

参考URL:http://jp2.php.net/include/

Q連想配列からの値の取り出し

お世話様です。

タイトルにもありますが連想配列を作成した後(以下に記述例)に
その配列からキーを指定して値を取得したいと思っております。
array_keys関数だと値を指定してキーを取得するみたいで
うまくいきませんでした。
何かよい方法ありませんでしょうか?

//配列に格納
while (条件) {
  $aParaOra += array((キー) => (値));
}

Aベストアンサー

解答番号No.1の者です。

ちなみに、キーの指定なしで全部取得するのであれば、
array_values($aParaOra)
で、配列化されたものが返ってきます。

もしくは、以下のようにforeachでループすれば、
キーと値を分離して取得できます。
foreach ($aParaOra as $key => $value) {
# $aParaOra[$key]の値が、$value
}

質問者さんが何をしたいのかがいまいちピンときません。

Qサイトのphpソースコードを表示する方法

参考のためにサイトのphpソースコードを表示する方法を知りたいです。

ある参考書にこのような解説がありました。
『$con = mysql_connect("localhost","sampleID","samplepass");
のようにphp内に直接ユーザ名とパスワードを記載することはいけません。
なぜなら、phpファイルはブラウザからアクセスして見ることができるからです。
対策として、ユーザ名とパスワードを記載したiniファイルを作り、
それをドキュメントルートよりも上位の場所に置くと良いでしょう。』

ブラウザからアクセスして見ることができる、とありますが、
見ることが出来るのは開発担当者達ということでしょうか。

SQLiteのデータベースも同様にドキュメントルートよりも上位の場所に保存
とあるサイトで解説していましたが、専用のソフトとかありますか?

Aベストアンサー

サーバの環境設定や「.htaccess」ファイル等のようなもので間違った設定を行い、
***.phpファイルにアクセスされた場合にPHPとして動作せず
他のHTMLファイルやテキストファイルのようにダウンロード表示されてしまう可能性は多分にあります。
SQLiteのファイルやCSVなんかも、パーミッション等々、正しく設定していなかった場合、簡単にアクセスされてしまいます。

その為、少なくとも、ドキュメントルートより上に直接アクセスされたくないファイルなどを置いて、
require_once, require, include, include_once等によりPHPから参照したりするのが一般的、という事ではないでしょうか。

Qwebサイトの「index」を非表示にしたい

質問です。

WEbサイトで「http://○○/index.html」の
「index」を非表示にしたいのですがうまくいきません。

「.htaccess」で

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
Options -Indexes
order deny,allow

と入力しサーバにアップはしているのですが、
他のページからINDEXページに戻ってきた際に
indexが表示されています。

最初にWEBページにやってきた時は消えている時もあります。
ブックマークからサイトにくると表示されています。

どこか間違っている箇所があるか
教えて頂けると幸いです。

よろしくお願い致します。

Aベストアンサー

<Files ~ "^\.(htaccess|htpasswd)$"> .htaccessファイルと.htaccessファイルは
deny from all  誰からもダメだよ
</Files>
Options -Indexes  Index を有効にしますよ
order deny,allow  

と言う意味です。したがって書かなくても良い。デフォルトで^\.はdenny from allになっているはずです。
 正規表現の意味はわかりますよね、
^ 行頭を表します。
\ 次に続く文字を文字通り解釈するようにエスケープします。
. 任意の文字を示します。エスケープされているので.(ドット)の文字を示します。
( | ) | はorですね。前者でなければ後者、この場合htaccessでなければhtapaawd
$ は行末を示します。

 正規表現はとても大事な基礎知識ですから覚えておきましょう。

HTTPサーバーとブラウザの仕事、

たとえば、あるページ(http://hoge.com/abc/efg/hij.html)内にあるリンクが
<a href="../www/abc">だったとすると、
【ブラウザ】は!!!-----ブラウザですよ。
|--/abc
|  |-- efg/
|     |-- hij.html
そのファイルが
|--/abc
|  |-- www/
|     |-- abc
であると判断して、サーバーに
GET:/abc/www/abc
と要求します。
 サーバーは、abcがファイルであれば、それを提供しますが、そのファイルが.htaccessなどで実行ファイルとして指定してあれば、処理を処理系に渡します。
 もしそうでなければ、それがディレクトリかもしれないと開いてみます。もしディレクトリでしたら、内部にDirectoryIndexで指定してあるファイルがないか調査します。
[例]
<IfModule dir_module>
DirectoryIndex index.html index.htm index.cgi index.sh
</IfModule>
の場合は、index.htmlから順番に探します。それがあれば提供します。

 それもなかった場合は、/abcを環境変数PATH_INFOに格納して、wwwについて同様の判断をします。
 それもなかったら、PATHINFOに/www/abcを格納して、トップディレクトリを精査します。

 このように、どのファイル(パスを含めて)を要求するかは、ブラウザの仕事であり、その要求にこたえるのはHTTPサーバーの仕事です。
 ですから、redirectなどで遷移しない限り、要求したものと同じURLが表示されるはずです。

 ブラウザが勝手にindex.htmlを付けることはありません。上の説明でわかるようにサーバーによるとindex.html ではなくて、index.htm だったり、index.cgi だったりindex.shだったり、INDEX.HTMだったりindex.phpだったり、ひょっとするとabcかもしれないのですから・・

 単にリンクの末尾にindex.htmlないし/index.htmlをつけなければ、そのままサーバーのDirectoryIndexで指定したファイルが帰ってくるはずです。

<Files ~ "^\.(htaccess|htpasswd)$"> .htaccessファイルと.htaccessファイルは
deny from all  誰からもダメだよ
</Files>
Options -Indexes  Index を有効にしますよ
order deny,allow  

と言う意味です。したがって書かなくても良い。デフォルトで^\.はdenny from allになっているはずです。
 正規表現の意味はわかりますよね、
^ 行頭を表します。
\ 次に続く文字を文字通り解釈するようにエスケープします。
. 任意の文字を示します。エスケープされているので.(ドット)の文字を示します。
( |...続きを読む


人気Q&Aランキング