2012-01-16 23 views
3

私は以下の問題があります。preg_replace、正規表現を取得する正規表現

私は、以下のフォーマット:

min: 34.0 max: 79.0383 lifetime: 17% code:iweo7373333 

それは、固定テキストタイプではないのですが、分も-7.94884444またはそうであることを意味します。どのようにして部品を部品から引き出すことができますか? 「」、...と、その後爆発:「寿命」、「最大」何もない、と:「分」私はスペースを交換すると、現時点ではそれをやった

$result['min'] = 34.0; 
$result['max'] = 79.0383 
and so on... 

ような配列は、その後、交換してください...主な問題は、時々他の変数がmin、max、...の間にあるため、位置が正しい値を保持しないことです。

また、私は本当に良いコーディングスタイルではないと思いますか?これは正規表現かpreg_replaceで可能ですか?

おかげで、 サシャ

答えて

3

も ​​- 私は思う - それは本当に良いコーディングスタイルではありませんか?

これについて権限を持つ必要はありません。あなたの目的によって異なります。この場合、私は個人的にJSONを選択します。 XMLは、ほとんどの場合、過剰なものになる可能性があります。 あなたが提案したフォーマットを維持するのに見る唯一の利点は、{}()[];,を使用して複雑な構文を必要としないことです(ネストする必要はありません)。

この正規表現は、値に空白文字を使用すると非常に寛容であること、あなたの文字列からすべてのparameter:valueの組み合わせに一致します:

だから、

(?<=^|)[A-Za-z-_]{0,}:[.,\$\-\+\s%\w]{0,}(?<=\s|\Z|^)

PHPで:

$string = "simple:I like to exchange data a-css-like-parameter: 34px CamelCasedParameter: -79.0383 underlined_parameter: 17%"; 

preg_match_all('/(?<=^|)[A-Za-z-_]{0,}:[.,\$\-\+\s%\w]{0,}(?<=\s|\Z|^)/', $string, $matches); 

$parameters = array(); 
foreach($matches[0] as $parameter){ 
    $exploded = explode(':', $parameter); 
    $parameters[$exploded[0]] = trim($exploded[1]); 
} 

print_r($parameters); 

出力:

> Array 
> (
> [simple] => I like to exchange data 
> [a-css-like-parameter] => 34px 
> [CamelCasedParameter] => -79.0383 
> [underlined_parameter] => 17% 
>) 
+0

これは私にとって最高の作品です。はい、ありがとう。まず、私はおそらく間違った言葉を使ったと言っています。それは私のために良いコーディングスタイルではないということです。可能であれば簡単な方法を使いたいのです:)次のことは、フォーマットを定義することができません。私はこの接続を取得します。そうでなければもちろんJSONが好きです。 – codeworxx

4

にpreg_replaceまたは正規表現を使用する方法について、 "悪い" ものは何もありません。しかし、このフォーマットされていない文字列を解析することは確かに理想的ではありません。ソース文字列を変更できる場合は、信頼性の高い結果を得るためにJSONまたはXMLを試してください。最低限、URL形式でも機能します(例:min = 123 & max = 456 & = 789)。主な質問への今の

// test data 
$result = array('min' => false, 'max' => false, 'lifetime' => false); 

// match any occurence of min/max/lifetime followed by : followed by text (anything not a space) 
if(preg_match_all('/\b(min|max|lifetime): +([^ ]+)/', $string, $matches, PREG_SET_ORDER)) { 
    foreach($matches as $m) { 
     $result[$m[1]] = $m[2]; // put each match into $result 
    } 
} 
var_dump($result); // see what we got back 
+0

ありがとう、ありがとう。まず、私はおそらく間違った言葉を使ったと言っています。それは私のために良いコーディングスタイルではないということです。可能であれば簡単な方法を使いたいのです:)次のことは、フォーマットを定義することができません。私はこの接続を取得します。そうでなければもちろんJSONが好きです。 – codeworxx