【问题标题】:preg_replace, regex getting Text Partspreg_replace,正则表达式获取文本部分
【发布时间】:2012-02-11 13:12:54
【问题描述】:

我有以下问题:

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

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:”替换为空,将“max:”,“lifetime:”,...替换为“,”,然后爆炸......主要问题是有时其他变量介于 min, max, .... 所以位置不保持正确的值。

另外 - 我认为 - 这不是一种非常好的编码风格,还是?这可以使用 regex 或 preg_replace 吗?

谢谢, 萨沙

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    使用 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。
    【解决方案2】:

    另外 - 我认为 - 这不是一种非常好的编码风格,或者?

    没有必要对此具有权威性。这取决于你的目的。在这种情况下,我个人会选择 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%
    > )
    

    【讨论】:

    • 这对我最有效,谢谢。好,谢谢。首先我必须说,我可能用错了词。我的意思是,这对我来说不是一种好的编码风格。如果可能的话,我喜欢使用简单的方法:) 接下来是,我无法定义我得到这个连接的格式 - 否则我当然更喜欢 JSON。
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2016-07-11
    • 2023-04-10
    相关资源
    最近更新 更多