PHP - 将此字符串:“adc 25 ... 123.50 xyz”转换为2个变量:“25”和“123.50”?

时间:2013-05-22 02:21:41

标签: php preg-replace

标题几乎总结了我想要实现的目标。

我有一个字符串,可以包含字母表中的字母,或者数字或字符,如“)”和“*”。它还可以包括由三个点“......”分隔的数字串,例如, “25 ... 123.50”。

此字符串的示例可能是:

peaches* 25...123.50 +("apples")-(peaches*) apples* 25...123.50

现在,我想要做的是捕获三个点之前和之后的数字,所以我最终得到了2个变量,25123.50。然后我想修剪字符串,以便最终得到一个排除数字值的字符串:

peaches* +("apples")-(peaches*) apples*

基本上是这样的:

$string = 'peaches* 25...123.50 +("apples")';
if (preg_match("/\.\.\./", $string ))
{
    # How do i get the left value (could or could not be a decimal, using .)
    $from = 25; 
    # How do i get the right value (could or could not be a decimal, using .)
    $to = 123.50;
    # How do i remove the value "here...here" is this right?
    $clean = preg_replace('/'.$from.'\.\.\.'.$to.'/', '', $string);
    $clean = preg_replace('/  /', ' ', $string);
}

如果有人能为我提供关于这项复杂任务的最佳方式的一些意见,我们将不胜感激!欢迎任何建议,意见,建议,反馈或意见,谢谢!

2 个答案:

答案 0 :(得分:2)

这个preg_match应该有效:

$str = 'peaches* 25...123.50 +("apples")';
if (preg_match('~(\d+(?:\.\d+)?)\.{3}(\d+(?:\.\d+)?)~', $str, $arr))
   print_r($arr);

答案 1 :(得分:1)

伪代码

循环:

在该位置为“...”和 substr 执行 strpos 。然后从该子字符串的末尾(逐个字符)返回,检查每个 is_numeric 句点。在第一个非数字/非句点出现时,您从原始字符串的开头到该点获取子字符串(暂时存储它)。然后开始检查is_numeric或另一个方向的句点。获取子字符串并将其添加到您存储的其他子字符串。重复。

这不是正则表达式,但它仍将实现同样的目标。

一些php

$my_string = "blah blah abc25.4...123.50xyz blah blah etc";
$found = 1;

while($found){

    $found = $cursor = strpos($my_string , "...");

    if(!empty($found)){

        //Go left
        $char = ".";
        while(is_numeric($char) || $char == "."){
            $cursor--;
            $char = substr($my_string , $cursor, 1);
        } 
        $left_substring = substr($my_string , 1, $cursor);

        //Go right
        $cursor = $found + 2;
        $char = ".";
        while(is_numeric($char) || $char == "."){
            $cursor++;
            $char = substr($my_string , $cursor, 1);
        } 
        $right_substring = substr($my_string , $cursor);

        //Combine the left and right
        $my_string = $left_substring . $right_substring;
    }
}

echo $my_string;