我在解析我的命令时遇到小数问题。 12.90 解析错误:
// My command
$cmd = 'CREATE product price:12.90, name: "Create me"';
// My parser
preg_match_all('/\w+|".*?"|(?!\s)\W/', $cmd, $list);
输出:
Array
(
[0] => CREATE
[1] => product
[2] => price
[3] => :
[4] => 12 // << problem starts here
[5] => .
[6] => 90
[7] => ,
[8] => name
[9] => :
[10] => "Create me"
)
我正在寻找这个输出:
Array
(
[0] => CREATE
[1] => product
[2] => price
[3] => :
[4] => 12.90 // supposed
[5] => ,
[6] => name
[7] => :
[8] => "Create me"
)
那么,我该如何解决这个问题呢?
编辑:(更好的解决方案)
伙计们,根据我的问题,我接受了杰西的回答。但我意识到这对我的复杂命令来说还不够好。它更好,因为它适用于 小数点,如 12.90
和别名,如 p.price
。因此,只需查看下面的示例和解析器即可。我希望这对某人有所帮助。
// My command
$cmd = 'GET `order` -o, product -p
LIST o.user_id, o.product_id, p.name, p.price
REL o.order_id = 3 AND p.price > 12.90';
// My complex command:
preg_match_all('/[0-9_\.]+|\w+|".*?"|`.*?`|\'.*?\'|!=|<=|>=|(?!\s)\W/', $cmd, $list);
// Output:
Array
(
[0] => Array
(
[0] => GET
[1] => `order`
[2] => -
[3] => o
[4] => ,
[5] => product
[6] => -
[7] => p
[8] => LIST
[9] => o
[10] => .
[11] => user_id
[12] => ,
[13] => o
[14] => .
[15] => product_id
[16] => ,
[17] => p
[18] => .
[19] => name
[20] => ,
[21] => p
[22] => .
[23] => price
[24] => REL
[25] => o
[26] => .
[27] => order_id
[28] => =
[29] => 3
[30] => AND
[31] => p
[32] => .
[33] => price
[34] => >
[35] => 12.90
)
)
最佳答案
\w
类不包含 .
因此“快速”修复是按如下方式添加它:
preg_match_all('/[\w.]+|".*?"|(?!\s)\W/', $cmd, $list);
对于允许的期限,您还有其他要求吗? (即只有在数字之间时才匹配?)。如果是这样,您可能需要使匹配更加特化。
让我突然想到的最重要的事情是句点是否会用作解析器其他方面的分隔符。如果您提供的 RE 是您的整个解析器,那么您可能没问题。
关于php - 通过正则表达式查找字符串中的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071049/