PHPで文字を検索して取り込む方法

このQ&Aのポイント
  • PHPで文字を検索して取り込む方法について解説します。
  • %の文字が含まれるソースから、全角の%の数値を取り込む方法をご紹介します。
  • 具体的なコード例も記載していますので、初心者の方でも分かりやすくなっています。
回答を見る
  • ベストアンサー

PHPで文字を検索して取り込みたい。

PHPで文字を検索して取り込みたい。 %の文字が、何度か出現するソースなのですが そのソースの中にある50%のような全角で%の数値を 取り込みたいのです。 //////ソース//////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> /////////////////////// 下記のように実行しましたが 思うような結果は得られません。 <?php $str = file_get_contents('http://123456/index.html'); if (preg_match('!<table>\s*?(.*?)</table>!s', $str, $res)) $text = mb_convert_encoding($res[1],"shift-jis","UTF-8");preg_match_all("/-*[0-9]+/",str_replace(",","",$text),$matches); print ($matches[0][0]); ////////////////////////////// php初心者です。 よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

すみません、ちょっと勘違いしました。 数だけ抜き出せばいいんですね? こんなかんじでどうでしょう? <? $str=<<<eof 80% すべて半角 82% すべて半角 85% すべて全角 88% すべて全角 XX% 不正なデータ 92% まぜこぜ 95% まぜこぜ eof; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val){ //print $val."<br>\n"; //全角のまま表示 print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?>

kei396
質問者

お礼

完璧に動きました。 ありがとうございます。 URLより、文字列を抜き出すのに苦労してます。 新たに質問させていただきましたので http://oshiete.goo.ne.jp/qa/6002533.html 目に留まられたら、またご指導お願いいたします。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

全角数字+%をカウントするということでいいですか? pregのチェックは基本はUTF8ですので、それ以外の文字コードだと誤動作する可能性が あるので気を付けてください。 <? $str=<<<eof 80% すべて半角 82% すべて半角 85% すべて全角 88% すべて全角 92% まぜこぜ 95% まぜこぜ eof; $pattern="/[0-9]%/u"; mb_internal_encoding("UTF8"); preg_match_all($pattern,$str,$matches); print count($matches[0]); ?>

kei396
質問者

お礼

各データを印字したいのですが なぜか動作しません^^ 色々試行錯誤しています。 <?php $str=<<<eof 80% すべて半角 82% すべて半角 85% すべて全角 88% すべて全角 92% まぜこぜ 95% まぜこぜ eof; $pattern="/[0-9]%/u"; mb_internal_encoding("UTF8"); preg_match_all($pattern,$str,$matches); print $matches[0]; ?>

関連するQ&A

  • PHPでURLのソースの中から数字の文字列を検索したいのですが

    PHPでURLのソースの中から数字の文字列を検索したいのですが <?php $str = 85%80%78%77%70%60%; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF-8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val) { print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?> この記述で、文字列から80%のような 全角文字で%の前の文字だけを抜き出せました。 そこでURLからデーターを抜き出すべく ////////ソース////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> 下記のように記述しましたが <?php $html_data = file_get_contents("http://www.1234.com/1234.html"); if (preg_match("/<table\s.*>([\s\S]*)<\/table>/i",$contents,$matches)){ $contents = $matches[1]; } $str = $html_data; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF-8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val) { print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?> しかし、動作しません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php 指定文字列以降の削除

    phpにて半角スペース以降の文字列を問答無用で削除するというプログラムを作ろうとしてるのですが上手くいきません。 どうすればできますでしょうか? ご教授のほどよろしくお願いいたします。 ---- ソースコード $str = '2017/1/1 10-28'; if (preg_match("/ /", $str)){ $replace = str_replace(' ', '', $str); } echo $replace;

    • ベストアンサー
    • PHP
  • 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

    質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。

    • ベストアンサー
    • PHP
  • 数字を抜き出す 

    arrayの特定のデーターのみを抜き出したいのですが サンプルの例えば6番目の+7だけ書き出すために 先日、教えていただき下記にて動作できたのですが <?php $html=<<<eof <td>3,383円</td> <td>3,321円</td> <td>-30円</td> <td>4,368円</td> <td>4,179円</td> <td>+7円</td> eof; preg_match_all("/-*[0-9]+/",str_replace(",","",$html),$matches); print_r($matches); print $matches[5]; ?> 結果は Array ( [0] => Array ( [0] => 3383 [1] => 3321 [2] => -30 [3] => 4368 [4] => 4179 [5] => 7 ) ) +7のみ表示させる為にはどうすれば良いのでしょう。 matches[5]では、だめなんですね? PHP初心者の為、ご教授お願いします。

    • 締切済み
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • 自動で増えてくれるPHP

    以前に質問させて頂いた内容をもとに、以下のようなものを作成しました。 以前の質問 → http://okwave.jp/qa/q6858703.html 作成したもの ↓ 【Aサーバ】「a.txt」(データ用) $name01='一子'; $age01='11'; $name02='二郎'; $age02='22'; 【Bサーバ】「b.html」(表示用) <?php $data = file_get_contents ('http://www.A/a.txt'); foreach (explode("\n" , $data) as $value) { if (preg_match ("/\\$(.+)='(.+)'/", $value, $matches)) { $$matches[1] = $matches[2]; } } echo '<table>'; echo '<tr><th>'.$name01.'</th><td>'.$age01.'</td></tr>'; echo '<tr><th>'.$name02.'</th><td>'.$age02.'</td></tr>'; echo '</table>'; ?> ここで質問なのですが、↑のような仕組みで、a.txtの中身が $name03='三太'; $age03='33'; $name04='~~'; $age04='~~'; と増えていった場合、b.htmlの echo '<tr><th>'.$name~~.'</th><td>'.$age~~.'</td></tr>'; が自動的に増えてくれるようなものを作りたいと考えています。 配列(?)を使うという方法も調べてみたのですが、分からず……。 ご教示願います。

    • ベストアンサー
    • PHP
  • UTF-8サイトを取得しSJISに

    以下のPHPで指定のサイトを取得すると文字化けしてしまいます。 何処が悪いのか分かる方、ご指導お願い致します。 <?php $str = file_get_contents('http://esthe-cinderellaesthe.on.omisenomikata.jp/diary'); mb_convert_encoding($str,"SJIS","UTF-8"); if (preg_match('!<div id="content">(.*?)<div class="pr">!s', $str, $res)){ print $res[1]; } ?>

    • ベストアンサー
    • PHP
  • PHP検索 完全一致のみヒット

    詳しくないので質問内容におかしな点が多々あるかと思いますが・・ サイト内検索でcsvファイルから文字列を呼び出し一致した文字列を出力するというスクリプトで 完全に一致した文字列だけ出力させたいのですが、 たとえばcsvに「AAA」「ABC」「ARZ」のデータがあり 「A」で検索しても何も出力されず、「AAA」と検索した時だけ「AAA」だけを出力したいのですが 「A」で検索すると「A」から始まる全ての文字列(↑で挙げた文字列全て)が出力されてしまって困っています。 どの部分を変えると完全に一致した文字列だけを検索できるようになるのか指摘してくださればと思います。 <?php function funcSiteLink($str, $pass, $csvFileName){ if($str){ $keyword = mb_convert_kana($str, "s","SJIS"); $arr_keyword = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY); $file = fopen($csvFileName,"r"); $i = 0; while(!feof($file)){ $csv = fgets($file); $str = explode(",", $csv); $keywordPassArr[$i] = $str; $i++; } $judg = 0; foreach($arr_keyword as $val){ foreach($keywordPassArr as $kpa){ preg_match("/$val/", $kpa[0], $matches, PREG_OFFSET_CAPTURE); if($matches[0][1] === 0){ echo '<p><a href="'.$pass .$kpa[1] .'">' .$kpa[0] .'</a></p>'; $judg++; } } } if($judg === 0){ echo "<p>一致しません</p>"; } fclose($file); }else{ echo "<p>一致しません</p>"; } } ?>

    • ベストアンサー
    • PHP
  • PHPとMySQLの文字化けの対応法は?

    OSはWinXPで、MySQL+PHPのアプリを作成しているところです。 <html> <head><title>配列データの取得</title></head> <body> <table border="1"> <tr><td>題名</td><td>著者</td><td>出版社</td></tr> <?php $host = "localhost"; if (!$conn = mysql_connect($host, "user", "pass")){ die("MySQL接続エラー.<br />"); } mysql_select_db("kisop", $conn); $sql = "SELECT * FROM book_table LIMIT 10"; $res = mysql_query($sql,$conn); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["btitle"]."</td>"); print("<td>".$row["bauth"]."</td>"); print("<td>".$row["bpub"]."</td>"); print("</tr>\n"); } mysql_free_result($res); ?> </table> </body> </html> と、こんな演習をしているのですが、ブラウザに表示させると文字化けしました。 HTML文はEUC、MySQLのデータは、シフトJISで入っていたようです。 そのため、「題名」「著者」などの見出しと、取り出したデータを同時に文字化けさせずに、表示できない 状態です(泣)。 MySQLからデータを取り出すときに、mb_convert_encodingで文字コードを変換してやれば 化けないでしょうが、出力しようとするデータのすべてを変換しなければなりません。 プログラマーさんたちは、文字化けの現象について、どう対応されているのでしょうか? いちいち、mb_convert_encodingで、変換しているものなのでしょうか? 定石のようなものを知りたいところです。 たとえば、HTML文は文字コード○○を使うものだ、設定ファイルを書き換えておく、などなど。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PHPとMysqlによる正規表現について

    データベースに登録した情報から検索するコードを書いたのですが、どう入力してもデータベースに登録した情報がすべて出てきてしまいます。 入力フォームに検索した条件だけ表示させたいです。 htmlの入力フォームを作り、そこから$_POSTでPHPに渡しました。 コードは以下のとおりです。 PHPの本を読んで見よう見まねで書いたのですが、さっぱりです。 ご教授よろしくお願いします。 <html> <head><title>検索php</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php $host="localhost"; if(!$conn=mysql_connect($host,"usr","passwrd")){ die("データベース認証エラー.<br />"); } mysql_select_db("usr",$conn); $condition=""; if(isset($_POST["name"])&&($_POST["name"]!="")){ $name=mysql_real_escape_string($_POST["name"]); $name=str_replace("%","\%",$name); $condition="WHERE table_a LIKE \"%".$name."%\""; } if(isset($_POST["phone"])&&($_POST['phone']!="")){ $phone=mysql_real_escape_string($_POST["phone"]); $phone=str_replace("%","\%",$phone); if($condition==""){ $condition="WHERE table_b LIKE \"%".$phone."%\""; }else{ $condition.="AND tabe_b LIKE \"%".$phone."%\""; } } $sql="SELECT * FROM table ".$condigition."ORDER BY table_id LIMIT 0,30"; $res=mysql_query($sql,$conn); print("<table border=\"1\">"); print("<tr><td>会社名</td><td>電話番号</td></tr>"); while($row=mysql_fetch_array($res)){ print("<tr>"); print("<td>".$row['table_a']."</td>"); print("<td>".$row['table_b']."</td>"); print("</tr>\n"); } print("</table>"); mysql_free_result($res); ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう