- ベストアンサー
簡単でお恥ずかしいのですが・・正規表現
文字列:aaa="あいうえお" bbb から あいうえお だけ、抽出したい $a= "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)\" bbb",$a,$b); print "$b[1]"; ではうまいてきません。 $a= "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)bbb",$a,$b); print "$b[1]"; では、 あいうえお" になってしまいます。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
どうもやりたいことが良くわかりません。 そんながちがちのパターンで検索しないでも、どのプロパティで“あいうえお” が現れるのかわかっているのならこんな感じのパターンマッチで十分な気がしますが。 <?php mb_regex_encoding('sjis'); $str = '<input type="text" name="Title" size="30" value="あいうえお" tabindex=1>'; print "try mb_ereg(1)\n"; $pat = 'value="(.*?)"'; mb_ereg($pat, $str, $matchmb); print_r($matchmb); print "try preg\n"; $pat = '\w+="(.*?)"'; preg_match_all("/$pat/", $str, $matchp); print_r($matchp); 実行結果: X-Powered-By: PHP/4.4.7 Content-type: text/html try mb_ereg Array ( [0] => value="あいうえお" [1] => あいうえお ) try preg Array ( [0] => Array ( [0] => type="text" [1] => name="Title" [2] => size="30" [3] => value="あいうえお" ) [1] => Array ( [0] => text [1] => Title [2] => 30 [3] => あいうえお ) ) サーバーによってどうこうは、バージョンによるものくらいしか 思いつきません #要はバグ
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
> \w+="(.*?)" は、言葉にするとどんな条件ですか? 単語を構成する文字(\w)の一文字異常の並びに'='が続き、それにダブルクォートに 囲まれた任意の文字列(長さ0以上)が続くもの といったところでしょうか。 で、ダブルクォートの中を$1として捕獲すると。 PHP 基礎編9 - 正規表現、マッチ、置き換え、ereg、eregi、eregi_replace - SAK Streets http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/php_k09.htm 前回の回答で書き忘れましたが、mb_regex_encoding}()は preg_* の関数群には影響しません。preg_*は、マルチバイト文字 としてはUTF-8のみ受け付けます(フラグ指定が必要)。
お礼
お手数をおかけしました。 ありがとうございます。 これで、htmlから、値を抽出する場合 配列に分解してから、指標で指定するというやり方で いろいろ応用できそうです。
- sakusaker7
- ベストアンサー率62% (800/1280)
mb_regexのデフォルトエンコーディングを指定する必要があるようです。 <?php mb_regex_encoding('sjis'); $str = 'aaa="あいうえお" bbb'; //$str = 'aaa="xxxxx" bbb'; print "try mb_ereg\n"; mb_ereg('aaa="(.*)" bbb', $str, $matchmb); print_r($matchmb); print "try preg\n"; preg_match('/aaa="(.*)" bbb/', $str, $matchp); print_r($matchp); 実行結果: X-Powered-By: PHP/4.4.7 Content-type: text/html try mb_ereg Array ( [0] => aaa="あいうえお" bbb [1] => あいうえお ) try preg Array ( [0] => aaa="あいうえお" bbb [1] => あいうえお )
- sakusaker7
- ベストアンサー率62% (800/1280)
ダブルクォートの中だけ取れればいいのなら、その前後のaaa とか bbb は 気にしないでいいと思うのですが、何か条件があったりします?
お礼
もうすこし、具体的に書きます。 $a より「正規表現」を使って、 「おいうえお」を抽出したいのです。 <?php $a= "<input type=\"text\" name=\"Title\" size=\"30\" value=\"あいうえお\" tabindex=1>"; $patrrn= "<input type=\"text\" name=\"Title\" size=\"30\" value=\""; mb_ereg("$patrrn(.*)\" tabindex=1>",$a,$b); print "$b[1]"; ?> サーバーによって結果が異なることなんて、ありますか?
補足
私の質問を見ていただきありがとうございます。 この例では、確かにその通りですが、 実際には、前後が続きますので、 ほかの個所でも""を使用しています。 特定の個所を区別するために、「bbb」 も含めて考えていただけますか?
- asuncion
- ベストアンサー率33% (2127/6289)
当方では、下記のスクリプトで あいうえお という結果を得ました。 PHP 5.2.5, WindowsXPの環境です。 <?php $a = "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)\" bbb", $a, $b); print "$b[1]"; ?>
補足
ご回答、ありがとうごさせいます。 そうですか? どうして私の環境では、 ダメなのでしょうか? php のバージョンは、「4.4.6」です。 やはり、うまくいきません。
お礼
sakusaker7さん、いろいろありがとうございます。 まず、 mb_regex_encoding('sjis')は、知りませんでした。 これを入れたら、成功しました。 また、別件として 下記のようなhtmlの中の カラーの値だけ(#FFFFFF,#000000,#0000FF)抽出したかったのです。 <font color="#FFFFFF">■</font>背景色<br> <input type="text" name="back_c" istyle="3" MODE="alphabet" maxlength="7" value="#FFFFFF"> <br> <font color="#000000">■</font>テキスト色<br> <input type="text" name="char_c" istyle="3" MODE="alphabet" maxlength="7" value="#000000"> <br> <font color="#0000FF">■</font>リンク色<br> <input type="text" name="link_c" istyle="3" MODE="alphabet" maxlength="7" value="#0000FF">'; 提示された「\w+="(.*?)」という正規表現でマッチングさせると、 配列の中に、配列ができていて、 その要素を明示的に指定することによって 抽出することにしました。 むーん、それにしても正規表現は難しすぎますね。 なんとか、今回は解決しました。 ありがとうございました。
補足
\w+="(.*?)" は、言葉にすると どんな条件ですか? ""で、囲まれたものを取り出す ということですか?