Это должно быть довольно просто, учитывая, что preg_match
имеет поддержку именованных групп захвата (которые, конечно, использует ваше регулярное выражение; больше здесь ).
Пример из документации PHP :
<?php
$str = 'foobar: 2008';
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however
* the above form is recommended for backwards compatibility */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);
print_r($matches);
?>
Приведенный выше пример выдаст:
Array
(
[0] => foobar: 2008
[name] => foobar
[1] => foobar
[digit] => 2008
[2] => 2008
)
Так что в вашем случае вы можете использовать $matches
массив, например $matches['application']
.
Редактировать: Хорошо, я не полностью понял вопрос.
Очевидная проблема с использованием регулярных выражений для generate strings - это то, что регулярное выражение может соответствовать бесконечным строкам.Например, /cat\s+rat/
соответствует всем:
cat rat
cat rat
cat rat
и т. Д.
Но в вашем примере ничего не определено.
Так что вы склонны определять "безопасный""или однопорожденный язык, который является подмножеством регулярных выражений, является хорошим, учитывая узкий вариант использования.Тогда вы можете заменить вхождения /\(\?P?<(\w+)>\)/
на значение группы захвата, находящейся там.
Но поскольку PHP не позволяет просто использовать значение группы захвата для доступа к переменной во время замены в одномшаг, вам, вероятно, придется сделать это в несколько этапов… например, сопоставить все вхождения вышеупомянутой группы, извлечь названные группы, а затем, наконец, выполнить (в цикле над $matches
как $match
) простую подстановку строки из '(?P<' . $match . '>)'
и '(?<' . $match . '>)'
до значения $$match
(хотя и безопаснее).