我有以下问题:
我有一个文本,例如以下格式:
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%
> )