массивы — Php несколько различных регулярных выражений

Этот код успешно выполняется. $ 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
)

)

Как должно быть регулярное выражение?
Итак, как я могу решить эту проблему?

1

Решение

Вы назначаете текст $string переменная, а затем в preg_match_all
ты используешь $text,
Я предполагаю, что это просто опечатка?

Теперь о другой части проблемы. Вы должны использовать не жадный матч. Добавление ? после вашего .* делает матч не жадным — останавливается на самом коротком матче.

если вы используете preg_match_all('/{#(.*?)#\}/', $string, $array);
тогда $ массив должен быть таким. Это то, что вы после?

Array
(
[0] => Array
(
[0] => {#Quantity#}
[1] => {#Id#}
)

[1] => Array
(
[0] => Quantity
[1] => Id
)

)
2

Другие решения

Используйте 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`
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector