我正在尝试将模板中的{{{month}}}等变量替换为当前月份,将{{{month + 1}}}替换为当前月份+1。 这不是我的代码中最难的部分,除了我写的正则表达式没有产生预期的结果。
$string = '{{{year}}}{{{month+1}}}';
preg_match_all('/{{{(?:([yY])ear|([mM])onth|([dD])ay)(?:(?<operation>[-|+])(?<amount>[1-9]+))?}}}/m', $string, $matches);
var_dump($matches);
为什么我有这么多空数组条目? 我在期待
[0] => array('{{{year}}}', '{{{month+1}}}')
[1] => array('y', 'm')
[2] => array('', '+')
[3] => array('', '1')
我做错了什么?
上述代码的回复是:
array(8) {
[0]=>
array(2) {
[0]=>
string(10) "{{{year}}}"
[1]=>
string(13) "{{{month+1}}}"
}
[1]=>
array(2) {
[0]=>
string(1) "y"
[1]=>
string(0) ""
}
[2]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(1) "m"
}
[3]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(0) ""
}
["operation"]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(1) "+"
}
[4]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(1) "+"
}
["amount"]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(1) "1"
}
[5]=>
array(2) {
[0]=>
string(0) ""
[1]=>
string(1) "1"
}
}
答案 0 :(得分:1)
您可以使用&#34; generic&#34;字符类匹配month
,year
和day
的第一个字母,然后使用具有正面观察效果的替代字符来确保匹配我们需要的内容。
preg_match_all('/{{{([yYmMdD])(?:(?<=[Yy])ear|(?<=[Mm])onth|(?<=[Dd])ay)(?:([-+])([1-9]+))?}}}/m', $string, $matches);
请参阅IDEONE demo
这是print_r
视图:
Array
(
[0] => Array
(
[0] => {{{year}}}
[1] => {{{month+1}}}
)
[1] => Array
(
[0] => y
[1] => m
)
[2] => Array
(
[0] =>
[1] => +
)
[3] => Array
(
[0] =>
[1] => 1
)
)