Этот код успешно выполняется. $ 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
)
)
Как должно быть регулярное выражение?
Итак, как я могу решить эту проблему?
Вы назначаете текст $string
переменная, а затем в preg_match_all
ты используешь $text
,
Я предполагаю, что это просто опечатка?
Теперь о другой части проблемы. Вы должны использовать не жадный матч. Добавление ?
после вашего .*
делает матч не жадным — останавливается на самом коротком матче.
если вы используете preg_match_all('/{#(.*?)#\}/', $string, $array);
тогда $ массив должен быть таким. Это то, что вы после?
Array
(
[0] => Array
(
[0] => {#Quantity#}
[1] => {#Id#}
)
[1] => Array
(
[0] => Quantity
[1] => Id
)
)
Используйте RegEx: '/{#([^}]*)#\}/'
Вместо многократного соответствия .
(любой персонаж), вы должны искать [^}]
который «любой символ, кроме }
» как }
где вы хотите прекратить сопоставлять.
Match 1
Full match 14-26 `{#Quantity#}`
Group 1. 16-24 `Quantity`
Match 2
Full match 37-43 `{#Id#}`
Group 1. 39-41 `Id`