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