Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.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 如何预赛';{95}1340{113}1488{116}1545{99}1364';_Php_Regex_Preg Match - Fatal编程技术网

Php 如何预赛';{95}1340{113}1488{116}1545{99}1364';

Php 如何预赛';{95}1340{113}1488{116}1545{99}1364';,php,regex,preg-match,Php,Regex,Preg Match,我想按原样预赛下面的比赛 $this_string = '{95}1340{113}1488{116}1545{99}1364'; 我最好的尝试是 preg_match('/^[\{\d+\}\d+]+$/', $this_string); 相配 {95}1340{113}1488 而且 {95}1340{113} 这是错误的。 我知道为什么它与最后一个例子相匹配。一个匹配{95}1340为真,因此“+”将始终为真。但我不知道如何判断它是否匹配,所以在“[…]”中它始终是完全匹配的 我

我想按原样预赛下面的比赛

$this_string = '{95}1340{113}1488{116}1545{99}1364';
我最好的尝试是

preg_match('/^[\{\d+\}\d+]+$/', $this_string);
相配

{95}1340{113}1488 
而且

{95}1340{113}
这是错误的。 我知道为什么它与最后一个例子相匹配。一个匹配{95}1340为真,因此“+”将始终为真。但我不知道如何判断它是否匹配,所以在“[…]”中它始终是完全匹配的

我希望只有这样的比赛

{…}…
{…}…{…}…
{…}…{…}…{…}…
尝试之一:

^(\{\d+\}\d+)+$
也匹配吗

{99}1364
在这个字符串的最后一个结尾作为第二个匹配,因此我得到一个包含两个元素的数组:

Array[0] = {95}1340{113}1488{116}1545{99}1364 and
Array[1] = {99}1364

问题是在正则表达式中不必要地使用了,即
[和]

您可以使用:

'/^(\{\d+\}\d+)+$/'

问题是在正则表达式中不必要地使用了,即
[和]

您可以使用:

'/^(\{\d+\}\d+)+$/'

将正则表达式转换为更清晰的形式是:
/^[\{\}0-9+]+$/
,这将被解释为这个chracters
{}0123456789+
中的所有内容,正是这些内容

您需要的是分组,对于分组,需要括号,而不是字符类
()
,而是
[]
,因此您要做的是替换
[]
[]


简短的回答:
'/^(\{\d+\}\d++$/'

将正则表达式转换为更清晰的东西是:
/^[\{\}0-9+]+$/
,这将被解释为这个代码中的所有内容
{}0123456789+
,正是这些内容

您需要的是分组,对于分组,需要括号,而不是字符类
()
,而是
[]
,因此您要做的是替换
[]
[]


简短回答:
'/^(\{\d+\}\d++$/'

您试图做的事情有点不清楚。自上次编辑以来,我假设您希望检查字符串的全局格式并逐个提取所有项(即
{121}1231
)。为此,您可以使用以下代码:

$str = '{95}1340{113}1488{116}1545{99}1364';
$pattern = '~\G(?:{\d+}\d+|\z)~';
if (preg_match_all($pattern, $str, $matches) && empty(array_pop($matches[0])))
    print_r($matches[0]);
\G
是字符串开头或上一个匹配的结尾的锚点
\z
是字符串末尾的锚点


只需使用
\z
的替换来检查最后一个匹配是否在字符串的末尾。如果最后一个匹配项为空,则在结束之前,您可以确保格式正确。

您尝试执行的操作有点不清楚。自上次编辑以来,我假设您希望检查字符串的全局格式并逐个提取所有项(即
{121}1231
)。为此,您可以使用以下代码:

$str = '{95}1340{113}1488{116}1545{99}1364';
$pattern = '~\G(?:{\d+}\d+|\z)~';
if (preg_match_all($pattern, $str, $matches) && empty(array_pop($matches[0])))
    print_r($matches[0]);
\G
是字符串开头或上一个匹配的结尾的锚点
\z
是字符串末尾的锚点


只需使用
\z
的替换来检查最后一个匹配是否在字符串的末尾。如果最后一个匹配项为空,您可以确保格式在结束前是正确的。

尝试
^(\{\d+\}\d+$
您希望精确匹配什么?我编辑了我的原始帖子,我猜@anubhava answer是您要查找的,但是
{99}1364
是有效的输入,对吗?根据您的规则:
{…}…
它确实有效。请尝试
^(\{\d+\}\d++$
您希望精确匹配什么?我编辑了我的原始帖子,我猜@anubhava答案就是您要找的,但是
{99}1364
输入正确吗?根据您的规则:
{…}…
它确实有效。^(\{\d+\}\d++$也将此字符串最后一端的{99}1364作为第二个匹配项进行匹配?!?!是否要提取这些值?^(\{\d+\}\d+$还将此字符串最后一个结尾的{99}1364作为第二个匹配项进行匹配?!?!是否要提取这些值?