Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式以匹配前面带有点的数字_Php_Regex_Preg Replace_Preg Match - Fatal编程技术网

Php 正则表达式以匹配前面带有点的数字

Php 正则表达式以匹配前面带有点的数字,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,我有一个字符串: Product, Q.ty: 1, Price: 120.00 我想选择第一个逗号后直到最后两个十进制数字(.00)的所有内容,或者,换句话说,选择产品,尽管它是可变的;不可变的是,Q.t,而且众所周知,字符串中的最后两个字符将是两个数字,前面是一个点——但是只有最后一个字符将始终是0,它前面的字符可以是任何0-9,但始终是一个数字 我用这个来匹配字符串: preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote(

我有一个字符串:

Product, Q.ty: 1, Price: 120.00
我想选择第一个逗号后直到最后两个十进制数字(.00)的所有内容,或者,换句话说,选择
产品
,尽管它是可变的;不可变的是
,Q.t
,而且众所周知,字符串中的最后两个字符将是两个数字,前面是一个点
——但是只有最后一个字符将始终是
0
,它前面的字符可以是任何
0-9
,但始终是一个数字

我用这个来匹配字符串:

preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote('.00') . '/', '', $data );
问题是,当最后两个数字不是00,而是50、40、30等其他数字时,它会失败。如果我将同一个正则表达式与一个数字“0”一起使用,它也不会工作,因为它将捕获字符串中的第一个0,就像我前面的示例中那样,并将忽略剩余的0

如何调整此表达式以捕获前面有“.”点的一组数字

*还有一点需要注意:这个preg_替换在foreach循环中;有些数据与我试图传递的模式完全不匹配;这很好,所以在这些情况下,我可以按原样打印字符串;但是对于foreach中有匹配项的情况,我想用零替换字符串的一部分*

谢谢

为什么不

/(\d+\.\d{2})$/
哪一个会捕获任何带小数点的尾随“数字”?

为什么不只是

/(\d+\.\d{2})$/

哪一个将捕获任何带小数点的尾随“数字”?

如果需要文字点,应将其替换为:\。

如果需要文字点,应将其替换为:\

 /([^,]*), Q\.ty: (\d*), Price: (\d*\.\d{2})/
通过使用
([^,]*),
它将使用字符串中的逗号作为第一个分隔符。这将捕获字符串的开头直到第一个逗号,第二个匹配项是数量,最后一个匹配项是价格

因此,您提供的字符串:

 Product, Q.ty: 1, Price: 120.00
会回来的

$1 = Product
$2 = 1
$3 = 120.00
顺便说一句,我不知道在你的例子中,Q之后的那个句号是故意的还是仅仅是打字错误

通过使用
([^,]*),
它将使用字符串中的逗号作为第一个分隔符。这将捕获字符串的开头直到第一个逗号,第二个匹配项是数量,最后一个匹配项是价格

因此,您提供的字符串:

 Product, Q.ty: 1, Price: 120.00
会回来的

$1 = Product
$2 = 1
$3 = 120.00
顺便说一句,我不知道在你的例子中,Q.ty中Q之后的那个句号是故意的还是仅仅是打字错误。

你可以试试

(.+?), (Q\.ty: \d+, .+?\.\d{2})
这应该将从第一个逗号到最后两个十进制数字的所有内容捕获到$2中,产品标签保留在$1中,您可以尝试

(.+?), (Q\.ty: \d+, .+?\.\d{2})
这应该将从第一个逗号到最后两个十进制数字的所有内容都记录到$2中,产品标签保存在$1中。我想有人(总是有的)会说“你可以用and来获取碎片。”但这并不是更快

<?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);

?>
使用更直接的方法,如果
$string
不偏离,则不会提高preg_match函数的性能

$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!";
我想有人(总是有的)会说“你可以用和得到碎片。”但这并不快

<?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);

?>
使用更直接的方法,如果
$string
不偏离,则不会提高preg_match函数的性能

$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!";


作为一个小小的提示,您可以在正则表达式中使用
d
来匹配一个数字。您是否可以显示其他示例字符串,并让我们知道还有什么是静态的,如产品和价格:我假设。“产品”更改;“,Q.t”将保持不变,字符串中的最后两个字符将始终是数字,前面有一个点。”“我在您的评论后编辑了我的原始问题-谢谢您作为一个小提示,您可以使用正则表达式中的
d
来匹配一个数字。您是否可以显示其他示例字符串,并让我们知道还有什么是静态的,例如Product,价格:我假设“产品”发生变化;“,Q.t”将保留在那里,字符串中的最后两个字符将始终是数字,前面有一个点。”“我在您的评论之后编辑了我的原始问题-谢谢谢谢谢谢,我还需要在第一个逗号之后获取所有内容,而不仅仅是右边的最后一个数字;基本上,我只需要保留“产品”标签,换句话说,我还需要在第一个逗号之后获得所有内容,而不仅仅是右边的最后一个数字;基本上,我只需要保留“产品”标签,换句话说,您使用的是“回头看”。它实际上并没有“捕获”语句的“Q\.ty:”部分。它只检查它的存在。哎呀,我以为OP想要Q.ty中逗号后面的文本。回答:太酷了。我只是想指出,对于任何不熟悉look arounds.的人来说,这在我的情况下不起作用-我正在寻找一些东西来替换我原来问题中的第二个'preg_quote()',或者一些东西来替换preg_replace中的字符串;我尝试了您示例中的代码,但没有成功。您正在使用look back。它实际上并没有“捕获”语句的“Q\.ty:”部分。它只检查它的存在。哎呀,我以为OP想要Q.ty中逗号后面的文本。回答:太酷了。我只是想指出,对于任何不熟悉look arounds.的人来说,这在我的情况下不起作用-我正在寻找一些东西来替换我原来问题中的第二个'preg_quote()',或者一些东西来替换preg_replace中的字符串;我尝试了你例子中的代码,但没有成功。谢谢,实际上我不需要变量;我原来问题中的preg_replace用于foreach循环,有些数据根本不匹配;在我的示例中,我正在寻找一些东西来替换preg_replace的内容,特别是对于第二个preg_quote(),这里有一个链接,您可以在preg replace中看到该模式的作用。我列出的这些变量实际上是preg_replace第二个参数的反向引用。在我看来,这比您原来的模式更简洁,允许您使用可变的细节将字符串重新格式化为您想要的格式。如果你坚持你的目标