2011-12-21 6 views
1

У меня есть строки, которые состоят из метки, подчеркивание и идентификатор:Каков наиболее эффективный способ отделить числовые и нечисловые части строки?

  • "category_4"
  • "office_362"
  • "core_market_56"

Что я бы хотели бы иметь две различные порции:

  • массив ("категория", 4)
  • массив («офис», 362)
  • массив («core_market», 56)

Я знаю, что я могу выделить числовое значение, затем развернитесь и вычитать, что из исходной строки, но я Не уверен, есть ли более чистый способ сделать это за один шаг. Аргумент 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

Спасибо, что ответили на часть технической эффективности. К сожалению, я не могу исправить длину идентификаторов, но это также было непонятно из вопроса. –

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)) 
Смежные вопросы