2012-01-16 5 views
3

У меня проблема:preg_replace, regex получение текстовых частей

У меня есть текст, например. следующий формат:

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?

Спасибо, Sascha

ответ

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 & limit = 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

Смежные вопросы