Я пытаюсь создать строку из регулярного выражения. Я заметил, что в системе маршрутизации структуры Kohana вы можете установить маршрут, используя что-то похожее на регулярное выражение. Затем вы можете создать URL-адрес, соответствующий маршруту, который вы установили. Я пытаюсь сделать что-то подобное, но я не могу найти чистый способ сделать это. Например, я получил следующее регулярное выражение:
/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/
Теперь я хочу сказать, что «приложение» равно «a», «контроллер» равно «b», «метод» равен «c» и «parameters» равен «d». Затем я должен получить строку, которая заменяет детали указанными значениями. Я не могу найти хороший способ сделать это. Я в основном думал о двух способах: 1) заменить соответствующие значения в регулярном выражении указанными значениями или 2) создать пользовательский «синтаксис регулярных выражений», который можно легко использовать для создания строки и преобразования ее в «правильную» «регулярное выражение, когда это необходимо. Кохана использует последнее, но оба способа звучат довольно плохо для меня. Как бы вы это сделали?
Редактирование: я попытаюсь немного разъяснить это. Я, например, передаю следующую строку в регулярное выражение, показанное выше, используя preg_match()
: «myApplication / myController / myMethod / myParameters». Это возвращает массив, который имеет пару элементов, включая 4 элемента с индексами «приложение», «контроллер», «метод» и «параметры» с соответствующими значениями. Теперь мне нужно создать строку «myApplication / myController / myMethod / myParameters» с шаблоном регулярного выражения, в то время как у меня есть только этот массив с 4 элементами. Как я могу это сделать с помощью PHP?
Это должно быть довольно простым, учитывая, что 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, например $matches['application']
.
Изменить: Хорошо, я не совсем понял вопрос.
Очевидная проблема с использованием регулярных выражений для генерации строк заключается в том, что регулярное выражение может соответствовать бесконечным строкам. Например, /cat\s+rat/
соответствует всем:
cat rat cat rat cat rat
и т.п.
Но в вашем примере ничего не определено.
Таким образом, ваша склонность определять «безопасный» или однократно генерируемый язык, который является подмножеством регулярных выражений, является хорошим, учитывая узкий прецедент. Тогда вы могли бы заменить вхождения /\(\?P?<(\w+)>\)/
со значением группы захвата.
Но так как PHP действительно не позволяет вам просто использовать значение группы захвата для доступа к переменной во время замены за один шаг, вам, вероятно, придется сделать это несколькими шагами … например, сопоставление всех событий вышеупомянутой группы, извлечение именованного групп, а затем, наконец, делая (в цикле над $matches
$match
как $match
) простую замену строк из '(?P<' . $match . '>)'
и '(?<' . $match . '>)'
к значению $$match
(хотя и более безопасным способом, чем это).