2011-12-21 16 views
1

私が持っているラベルで構成された文字列、アンダースコア、およびID:文字列の数値部分と非数値部分を分離する最も効率的な方法は何ですか?

  • "category_4"
  • "core_market_56"

私は何をしたい "office_362"持っていると二つの別個のチャンクである:

  • アレイ( "カテゴリ"、4)
  • 私は好転し、元の文字列からそれを減算し、その後、数値を単離することができることを知っている配列(「オフィス」、362)
  • アレイ(「core_market」、56)

、私これを1つのステップで行うよりクリーンな方法があるかどうかはわかりません。 Explodeのlimit引数は近いと思われ、最後のアンダースコアだけで分割できる正規表現パターンがあると感じました。

答えて

2

これは、あなたが

(\w*)_(\d*) 

最初に一致したグループは、あなたの言葉、秒たい正規表現である - 数。これはもちろん、数字は常に最後であり、アンダースコアで単語から分離されているという前提に基づいています。

+0

感謝を返します、私はそれを感謝します! –

+0

私の喜び:-) –

0

私は目的を解析するための最も効率的な方法は、あなたが常に文字列の末尾から文字の正確な数をカウントし、その残りの部分を知ることができるように、最後に固定長数値フィールドを持つことである把握(区切り記号を差し引いたもの)がテキスト・ポーションになります。

# Example with fixed length numeric portion of 8 digits 
$N = 8; 
$s = "SomeText_00000001"; 
$text = substr($s, 0, strlen($s) - $N - 1); 
$num = substr($s, -$N); 
+0

技術効率の部分にお返事ありがとうございます。残念ながら、私はIDの長さを修正することはできませんが、それはまた質問から明らかではありませんでした。 –

2
$strings = array("category_4","office_362","core_market_56"); 
foreach($strings as &$string) 
{ 
    preg_match('/(\w*)_(\d*)/', $string, $matches); 
    $string = array($matches[1],$matches[2]); 
} 
print_r($strings); 

上記の解答と解説のため

([0] => Array (
      [0] => category 
      [1] => 4) 
[1] => Array (
      [0] => office 
      [1] => 362) 
[2] => Array (
      [0] => core_market 
      [1] => 56)) 
関連する問題