preg_replace,正则表达式获取文本部分

时间:2012-01-16 16:02:19

标签: php regex preg-replace

我有以下问题:

我有一个文字与例如以下格式:

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

它不是固定文本类型,意味着min也可以是-7.94884444左右。我如何提取例如像

这样的数组
$result['min'] = 34.0;
$result['max'] = 79.0383
and so on...

我现在用替换空格做了,然后用“min:”替换“min:”,“max:”,“lifetime:”,......用“,”然后爆炸......主要问题是有时其他变量介于min,max,....所以位置不能保持正确的值。

另外 - 我认为 - 它不是一个非常好的编码风格或者?这可能是使用regex或preg_replace吗?

谢谢, 的Sascha

2 个答案:

答案 0 :(得分:4)

使用preg_replace或regex没什么“坏”的。但是,解析这个未格式化的字符串肯定不是理想的。如果您可以修改源字符串,请尝试JSON或XML以获得更可靠的结果。至少,即使是网址格式也会更好(例如,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

答案 1 :(得分: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%
> )