preg_replace,regex获取文本部分


preg_replace, regex getting Text Parts

我有以下问题:

我有一个文本,例如以下格式:

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:"替换为"none","max:","lifetime:"。。。用","然后爆炸。。。主要问题是,有时其他变量介于min、max、…之间。。。。因此这些位置不能保持正确的值。

而且,我认为,这不是一个真正好的编码风格,或者?使用regex或preg_replace可以实现这一点吗?

谢谢,Sascha

使用preg_replace或regex并没有什么"坏"之处。不过,解析这个未格式化的字符串肯定不理想。如果可以修改源字符串,请尝试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

而且,我认为,这不是一个真正好的编码风格,或者?

这件事不需要权威,这取决于你的目的。在这种情况下,我个人会选择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%
> )