Мой ответ будет немного длиннее. Похоже, вы хотите сделать что-то похожее на использование URI Templates , так что вот фрагмент из двух функций из класса (называемый xs_Breakdown), который у меня есть, который выполняет эти вещи. Это может быть легко расширено, чтобы включить подстановочные знаки и условное поведение (в списке задач какое-то время в будущем я страдаю от слишком малого количества дел). Во-первых, и пример настройки и использования;
$br = new xs_Breakdown ( '{first}/{second}/{third}/{fourth}/{fifth}/{andsoon}' ) ;
// Pick out the template variable called 'third'
$third = $br->third ;
Код (только основы, которых должно быть достаточно, чтобы поднять часть вашей собственной пыли; весь код будет слишком длинным, чтобы публиковать здесь. Напишите мне сообщение, если вы хотите весь шебанг с тремя вложенными свойствами / Java Bean-подобные классы);
// Static variable to hold our tokens
$_tokens = null ;
// Input path (set in constructor)
$_path = null ;
// Results here
$values = array() ;
function parse ( $schema = '' ) {
// Sanitize input data : Regular Expression
$regexp = '/[^a-z0-9 +\-\/!$*_=|.:]/i' ;
// Break our path into little bits
$break = explode ( '/', $this->_path ) ;
// Find the tokens used from our schema template
$this->_tokens = $this->getSubStrs ( "{","}", $schema ) ;
// Loop through the path elements
foreach ( $break as $key => $value ) {
// Sanitize the value of the element
$value = urldecode ( trim ( preg_replace ( $regexp, '', $value ) ) ) ;
// Element not blank? (Meaning, real text)
if ( $value != '' )
// Index it!
@$this->values[$this->_tokens[$key]] = $value ;
}
}
function getSubStrs ( $from, $to, $str, &$result = array () ) {
if ( strpos ( $str, $from ) !== false ) {
$start = strpos ( $str, $from ) + 1 ;
$end = strpos ( $str, $to ) - 1 ;
$item = substr ( $str, $start, $end - $start + 1 ) ;
$rest = substr ( $str, $end + 2 ) ;
$result[] = $item ;
$this->getSubStrs ( $from, $to, $rest, $result ) ;
}
return $result ;
}