2016-06-20 2 views
0

Что касается практики и последующей разработки, я работаю над PHP-маршрутизатором. Для этого маршрутизатора, мои преобразованные маршруты могут иметь параметры в них, маршрут выглядит следующим образом:Поиск нескольких совпадений регулярных выражений в одной строке

/дома/{я: pageNum}/{s: имя_пользователь}

Есть теперь 2 переменных в этом маршруте:

  • переменная pageNum, которая представляет собой тип INT
  • переменная имя_пользователя, которая является тип строки

Для захвата этих данных, я написал это регулярное выражение:

{((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)} 

Это прекрасно работает, но единственная проблема с этим является то, что она только фиксирует только первую переменную.

Он снимает больше этих совпадений, когда я помещаю новый маршрут на новую строку.

Я попытался захватить все регулярное выражение, окружив его ( и ). Это не сработало.

Как я могу сделать это регулярное выражение так, чтобы оно фиксировало больше совпадений в одной строке текста?

Для вызова этого регулярное выражение, я использую следующий PHP функции:

preg_match("/{((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)}/", "/home/{i:pageNum}/{s:userName}", $matches); 
+0

Какую функцию php вы используете, чтобы соответствовать? – h4r5h4

+0

вы можете показать php-код, где вы используете это регулярное выражение? Я предполагаю, что проблема заключается в том, что вы используете [preg_match()] (https://php.net/preg_match) вместо [preg_match_all()] (https://php.net/preg_match_all). PHP имеет две отдельные функции для сопоставления один раз vs global, а некоторые другие языки просто используют '// g' для глобального сопоставления. –

+0

Я обновил свой вопрос, я использую preg_match(). – Bas

ответ

0

Просто используйте preg_match_all() и PREG_SET_ORDER:

preg_match_all("/{((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)}/", 
       "/home/{i:pageNum}/{s:userName}", 
       $matches, 
       PREG_SET_ORDER); 

Тогда:

foreach($matches as $match) { 
    echo $match['name'] . ' = ' . $match['type']; 
} 

Использование по умолчанию PREG_PATTERN_ORDER вы можете сделать:

$matches = array_combine($matches['name'], $matches['type']); 

foreach($matches as $name => $type) { 
    echo "$name = $type"; 
} 
+0

Я полностью забыл, что я разместил этот вопрос и не был активен в StackOverflow. Здесь благодарю за ответ, это действительно то, что мне нужно. Мой единственный вопрос: что делают 'PREG_SET_ORDER' и' PREG_PATTERN_ORDER'? – Bas

+0

Они просто определяют, как совпадения возвращаются в массиве: http://php.net/manual/en/function.preg-match-all.php – AbraCadaver

Смежные вопросы