我有一个字符串:
Product, Q.ty: 1, Price: 120.00
我想在第一个逗号之后选择最后两位小数(.00)之后的所有内容 - 换句话说,选择Product
,这将是可变的;不变量的是, Q.t
,并且还知道字符串中的最后两个字符将是以点.
开头的两个数字 - 但是只有最后一个字符始终为0
,它前面的那个可以是任何0-9
,但总是一个数字。
我用它来匹配字符串:
preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote('.00') . '/', '', $data );
问题是,当最后两位数字不是00但是其他东西如50,40,30等时失败。如果我使用相同的正则表达式与单个数字'0',它将无法正常工作,因为它将捕获字符串中的第一个0,就像我之前的示例中一样,并将遗漏剩余的0。
如何调整此表达式以捕获前面带有'。'的数字组。点?
*还有一点需要注意:这个preg_replace在foreach循环中;我试图通过的所有模式都不会匹配某些数据;这是好的,所以在那些情况下,我可以按照它们的方式打印字符串;但是对于foreach中匹配的情况,我想用零替换部分字符串*
谢谢
答案 0 :(得分:2)
为什么不
/(\d+\.\d{2})$/
会捕获带小数位的任何尾随“数字”吗?
答案 1 :(得分:2)
/([^,]*), Q\.ty: (\d*), Price: (\d*\.\d{2})/
通过使用([^,]*),
,它将使用字符串中的逗号作为第一个分隔符。这将捕获字符串的开头直到第一个逗号,第二个匹配将是数量,最后一个匹配将是价格。
所以你提供的字符串:
Product, Q.ty: 1, Price: 120.00
将返回
$1 = Product
$2 = 1
$3 = 120.00
在附注中我不知道Q.ty中的Q之后的那个时期是你的例子中的故意还是仅仅是一个错字。
答案 2 :(得分:2)
你可以尝试
(.+?), (Q\.ty: \d+, .+?\.\d{2})
这应该捕获从第一个逗号到最后两个十进制数字到$ 2的所有内容,产品标签保存在$ 1
答案 3 :(得分:2)
我认为某人(总有)会说“你可以通过str_replace()
和explode()
得到这些作品。”然而,它并不快。
<?php
$string = "Product, Q.ty: 1, Price: 120.00";
$removals = array(",",":");
$stime = microtime();
$nstring = str_replace($removals,'',$string);
$parts = explode(" ",$nstring);
echo microtime()-$stime."secs\n";
print_r($parts);
$pattern = "!^([A-Za-z]+),\s([A-Za-z.]+)\:\s([0-9]+),\s([A-Za-z]+):\s([0-9.]+)$!";
$ptime = microtime();
$m = preg_match($pattern,$string,$matches);
echo microtime()-$ptime."secs\n";
print_r($matches);
?>
<强>输出强>
4.0999999999958E-5secs
Array
(
[0] => Product
[1] => Q.ty
[2] => 1
[3] => Price
[4] => 120.00
)
3.5000000000007E-5secs
Array
(
[0] => Product, Q.ty: 1, Price: 120.00
[1] => Product
[2] => Q.ty
[3] => 1
[4] => Price
[5] => 120.00
)
使用更文字的方法,提供$string
不会偏离,不会提高preg_match函数的性能。
$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!";
答案 4 :(得分:1)
如果你想要一个文字点,你应该看看:\。