2016-05-17 6 views
0

基本的に私のpreg_matchは正常に動作しています。しかし、テキストの部分的な値(数字ではない)が存在するとき、私は正しいことを入力しようとした試みがあることを知る必要があります。preg_match部分値を知る方法はあります

例1:

$text = "2000 FC 
2 A 
100 FH 
1200 ACT FC 
"; 

例2:

$text = "2000 FC 
2 A 
100 FH 
ACT FC 
"; 

CODE:

preg_match("~(?P<value>\d+(?:.\d+)*?)\h(?P<unit>ACT\sFC)~", $text, $act_fc); 

実施例1は、正しいテキスト "1200 ACTのFC" を示しています。 preg_matchが実行されると、1200がvalueに割り当てられ、ACT_FCが$ act_fc配列のunitに割り当てられます。

しかし、例2のように「ACT FC」のみの場合は、$ act_fc配列は空です。

「ACT FC」だけをチェックする別のpreg_matchを実行しないで、ACT_FCを返す方法がありますか?たぶん "ユニット"が配列に値を設定し、 "値"がnullになる可能性があります。

注:コードの一部がほぼ同じままであるように、改行間のデータのマッチングを扱っています。

+1

ここで非貪欲な量指定子を使用する理由はありません: '(?:。\ d +)*? '。ドットは、文字(改行を除く)を意味し、リテラルドットは意味しません。リテラルドットを理解するには、それをエスケープする必要があります: '\ .'。オプションのものを作る必要がある場合は、 '?'量子を使います。 –

答えて

3

あなたは(?:...)?と、オプションの値の一部を行うことができます。ここでは

preg_match("/(?:(?P<value>\d+(?:\.\d+)*?)\h)?(?P<unit>ACT\sFC)/", $text, $act_fc); 

demoです。 ここにregex testerです。

+1

この場合、非キャプチャグループを使用する方がよいでしょう。 –

+0

はい、そうです。ありがとうございました。更新された答え。 – sevavietl

+0

これは、時にはスペースがないことを除いて、素晴らしいことです。 1200ACTのようにFC – no1uknow

関連する問題