人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

正規表現で、次の文字の##内を取り出したいと思います。

■文字
[flag]#1#
[name]#田中#

■取り出したい文字
"1"と"田中"

^\[flag\]#([\d+])#\\n\[name\]#(.+?)#
で取り出せると思うのですが、結果は何も取り出せずうまくいきません。

根本に誤りがあると思いますが、よろしくお願いいたします。


●質問者: cochoo
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:FLAG name 根本 正規表現 田中
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●35ポイント

(前提)

過去質問からphpだと仮定します。


(推理)

不要と思われる部分が3箇所(太赤字)

^\[flag\]#([</span>\d+])#\\n\[name\]#(.+?)#

(確認)

テストコードと出力結果

<?php
$a = "[flag]#1#\n[name]#田中#";
preg_match('/^\[flag\]#(\d+)#\n\[name\]#(.+?)#/', $a, $m);
print_r($m);
?>

Array
(
 [0] => [flag]#1#
[name]#田中#
 [1] => 1
 [2] => 田中
)

URL必須という事なので記載してますがURLに特に意味はありません。

PHP: PCRE 正規表現構文 - Manual

PHP: preg_match - Manual

PHP: print_r - Manual

◎質問者からの返答

ありがとうございます。

?のケースではご指摘とおり期待値を取り出すことができるのですが、?のケースで悩んでいます。

? $a = "[flag]#1#\n[name]#田中#";

? $a = "[flag]#1#

[name]#田中#";

私の環境はWindowsであり、この場合、

?のケースは以下の(A)の方法で対応できることを確認したのですが、

「改行」コードは機種依存なので、どのような機種になっても動作する方法で悩んでいます。

(A) ^\[flag\]#(\d+)#\r\n\[name\]#(.+?)#/ … パターンマッチする

(B) ^\[flag\]#(\d+)#\n\\r[name\]#(.+?)#/ … パターンマッチしない

機種依存とならない方法について、もう少しご教授いただけないでしょうか?

質問の内容が少し変わって申し訳ありません。

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


2 ● kn1967
●35ポイント ベストアンサー

[角括弧]で囲って、いずれかにマッチという判断をさせる。

\n

[\r\n|\r|\n]

に変更。


(ちょっと横道)

取り扱いが少し複雑になるかもしれませんが、

後々になって改変が発生した場合に応用が利きますので、

お時間あれば出力結果を確認してみてください。

<?php
$a = "[flag]#1#\n[name]#田中#";
preg_match_all('/\[(.+?)\]#(.+?)#/', $a, $m);
print_r($m) ;
?>

PHP: preg_match_all - Manual

◎質問者からの返答

なるほど、そういう手もありますね。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ