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

PHP5.1.6で正規表現の質問です。

『I79C-1898235197 テスト文字』

このような文字列があるとします。
一番左は英字の大文字'I'です。
次に整数の数字が何桁(この例では79)か続き、次に英字の大文字'C'があります。
次に数字が何桁(この例では-1898235197)か続き、次に半角スペースが入り、マルチバイトと続きます。
上記例の2箇所の数字を抜き、2つの変数に代入したいのですがどのように書けばいいでしょうか?

1.『』は含まれません。
2.英字大文字の'I'と'C'は必ず2箇所数字の頭にそれぞれつきます。
3.2箇所の数字はいずれも何桁か判らずマイナスの可能性もあります。
4.半角スペースはない場合もありますが、2つめの数字の次は必ず英字かマルチバイトとなっています。

よろしくお願いします。

●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:C-1 つの テスト バイト マイナス
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● HowAreYou
●13ポイント

こういうことでしょうか?

<?php
$str = 'I79C-1898235197 テスト文字』' ;

preg_match_all('/\d+/', $str, $mat) ;

list($a, $b) = $mat[0] ;
◎質問者からの返答

ご回答ありがとうございます。

先ほどは失礼しました。

今実行しましたら、$aに79、$bには1898235197が入っていました。

マイナス符号もつけて、-1898235197が入ってほしいのです。


2 ● あすか
●26ポイント

下記のようなプログラムになります。

取り出したい数字(正数、負数、小数)は変数 $s1, $s2 に入ります。

<?php
$str = 'I79C-1898235197 テスト文字';
$pat = "/I([\-\.0-9]+)C\-([\-\.0-9]+)/iu";
preg_match($pat, $str, $arr);
$s1 = $arr[1];
$s2 = $arr[2];
echo $s1 . "<br />\n";
echo $s2 . "<br />\n";
?>
◎質問者からの返答

いつもありがとうございます。

質問が判りつらいですね。

こちらも$s2 でマイナス符号が抜けてしまいました。

マイナス符号は必要です。

また、質問に説明が抜けていましたが整数ですので、少数対処は今回は必要なかったです。

でもありがとございました。


3 ● うぃんど
●38ポイント ベストアンサー

1つだけ抜き出す例

<?php
$text = 'I79C-1898235197 テスト文字';
if (preg_match('!I(\d+)C(-?\d+)!', $text, $m)) {
 echo $m[1];
 echo ':'; // 見やすくするための区切り文字
 echo $m[2];
 echo "<br />\n"; // 見やすくするための改行コード
} else {
 echo '適合しませんでした';
}

一度に沢山抜き出す例

<?php
$text =<<<text_end
I79C-1898235197 テスト文字
I80C123456789 テスト文字
I81C987654321Aテスト文字
text_end;
if (preg_match_all('!I(\d+)C(-?\d+)!', $text, $m)) {
 foreach($m AS $v) {
 echo $v[1];
 echo ':'; // 見やすくするための区切り文字
 echo $v[2];
 echo "<br />\n"; // 見やすくするための改行コード
 }
} else {
 echo '適合しませんでした';
}
◎質問者からの返答

パーフェクトです。

動作を確認しました。

正規表現はネットで何度も例文を探しますが応用が利きません。

皆さんのお答えを照らし合わせ訓練したいと思います。

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


4 ● あすか
●13ポイント

ご指摘に沿うよう、改良しました。

<?php
$str = 'I79C-1898235197 テスト文字';
$pat = "/I([\-0-9]+)C([\-0-9]+)/iu";
preg_match($pat, $str, $arr);
$s1 = $arr[1];
$s2 = $arr[2];
echo $s1 . "<br />\n";
echo $s2 . "<br />\n";
?>
◎質問者からの返答

ご回答ありがとうございます。

まだ試していませんが後ほどじっくり勉強したいと思います。

関連質問


●質問をもっと探す●



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