PHP извлекает значения из одной строки на основе шаблона, определенного в другой - PullRequest
1 голос
/ 26 апреля 2010

У меня есть две строки:

$first = '/this/is/a/string';
$second = '/this/:param1/a/:param2';

И я пытаюсь получить это:

$params = array('param1' => 'is', 'param2' => 'string');

Но добраться от пункта а до б - это больше, чем может выдержать мой усталый мозг в данный момент.

Все, что начинается с ':' во второй строке, определяет имя / позицию переменной. В $ second может быть любое количество переменных, которые нужно извлечь из $ first. Сегменты разделены символом «/».

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Ради интереса я добавлю немного другой подход. Это занимает примерно половину времени у Клетуса (чей ответ превосходен), потому что он использует меньше регулярных выражений и условных выражений:

$first = '/this/is/a/string';
$second = '/this/:param1/a/:param2';

$firstParts = explode('/', $first);
$paramKeys = preg_grep('/^:.+/', explode('/', $second));

$params = array();
foreach ($paramKeys as $key => $val) {
    $params[substr($val, 1)] = $firstParts[$key]; 
}

/*
output:
Array
(
    [param1] => is
    [param2] => string
)
*/
2 голосов
/ 26 апреля 2010

Введите:

$first = '/this/is/a/string';
$second = '/this/:param1/a/:param2';
$src = explode('/', $first);
$req = explode('/', $second);
$params = array();
for ($i = 0; $i < count($req); $i++) {
  if (preg_match('!:(\w+)!', $req[$i], $matches)) {
    $params[$matches[1]] = $i < count($src) ? $src[$i] : null;
  }
}
print_r($params);

Выход:

Array
(
    [param1] => is
    [param2] => string
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...