此代码已成功运行。 $ array [1]返回了列名。
//My String
$string = '<input value="{#Quantity#}" type="number" />';
preg_match_all('/{#(.*)#\}/i', $text, $array);
print_r($array);
/*
Returned :
Array
(
[0] => Array
(
[0] => {#Quantity#}
)
[1] => Array
(
[0] => Quantity
)
)
*/
但是如果文本中有更多列名。它不起作用:
$string = '<input value="{#Quantity#}" data-id="{#Id#}" type="number" />';
preg_match_all('/{#(.*)#\}/i', $text, $array);
print_r($array);
/*
Returned :
Array
(
[0] => Array
(
[0] => {#Quantity#}" data-id="{#Id#}
)
[1] => Array
(
[0] => Quantity#}" data-id="{#Id
)
)
*/
我想要这个数组
Array
(
[0] => Array
(
[0] => {#Quantity#}" data-id="{#Id#}
)
[1] => Array
(
[0] => Quantity
[1] => Id
)
)
正则表达式应该如何? 那么,我该如何解决这个问题?
答案 0 :(得分:2)
您要将文本分配到$string
变量,然后分配到preg_match_all
您正在使用$text
。
我猜这只是一个错字?
现在问题的其他部分。你应该使用非贪婪的比赛。在?
之后添加.*
会使比赛变得非贪婪 - 在最短的比赛中停止。
如果您使用preg_match_all('/{#(.*?)#\}/', $string, $array);
然后$ array应该是这个。这就是你追求的吗?
Array
(
[0] => Array
(
[0] => {#Quantity#}
[1] => {#Id#}
)
[1] => Array
(
[0] => Quantity
[1] => Id
)
)
答案 1 :(得分:1)
使用RegEx:'/{#([^}]*)#\}/'
除了重复匹配.
(任何字符)之外,您应该查找[^}]
,这是&#34;除}
&#34;之外的任何字符。因为}
是你想要停止匹配的地方。
Match 1
Full match 14-26 `{#Quantity#}`
Group 1. 16-24 `Quantity`
Match 2
Full match 37-43 `{#Id#}`
Group 1. 39-41 `Id`