Создать строку из регулярного выражения PHP - PullRequest
3 голосов
/ 16 августа 2011

Я пытаюсь создать строку из регулярного выражения.Я заметил, что в системе маршрутизации платформы Kohana вы можете установить маршрут, используя нечто похожее на регулярное выражение.Затем вы можете создать URL, соответствующий заданному вами маршруту.Я пытаюсь сделать что-то подобное, но я не могу найти чистый способ сделать это.Например, я получил следующее регулярное выражение:

/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/

Теперь я хочу сказать, что «application» равно «a», «controller» равно «b», «method» равно »с "и" параметры "равны" д ".Тогда я должен получить строку, которая заменяет части с указанными значениями.Я не могу найти хороший способ сделать это все же.Я в основном думал о двух способах: 1) заменить соответствующие значения в регулярном выражении указанными значениями, или 2) создать собственный «синтаксис регулярных выражений», который можно легко использовать для создания строки и преобразования ее в «правильный»"регулярное выражение при необходимости.Kohana использует последнее, но оба способа звучат для меня довольно плохо.Как бы вы это сделали?

Редактировать: Я постараюсь уточнить это немного.Например, я передаю следующую строку в регулярное выражение, показанное выше, используя preg_match(): «myApplication / myController / myMethod / myParameters».Это возвращает массив, который имеет пару элементов, включая 4 элемента с индексами «application», «controller», «method» и «parameters» с соответствующими значениями.Теперь мне нужно создать строку «myApplication / myController / myMethod / myParameters» с шаблоном регулярного выражения, в то время как у меня есть только этот массив с 4 элементами.Как я могу сделать это с помощью PHP?

1 Ответ

2 голосов
/ 16 августа 2011

Это должно быть довольно просто, учитывая, что 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 (хотя и безопаснее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...