2

标题几乎概括了我想要完成的事情。

我有一个字符串,它可以由字母表中的字母或数字或字符(如“)”和“*”组成。它还可以包括由三个点“...”分隔的数字字符串,例如“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);
}

如果有人可以就完成这项复杂任务的最佳方式向我提供一些意见,我们将不胜感激!欢迎任何建议、意见、意见、反馈或意见,谢谢!

4

2 回答 2

2

这个 preg_match 应该工作:

$str = 'peaches* 25...123.50 +("apples")';
if (preg_match('~(\d+(?:\.\d+)?)\.{3}(\d+(?:\.\d+)?)~', $str, $arr))
   print_r($arr);
于 2013-05-22T03:39:44.220 回答
1

伪代码

在一个循环中:

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

它不是正则表达式,但它仍然可以实现相同的目标。

一些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;
于 2013-05-22T02:32:42.690 回答