Может ли preg_match() (или другая функция регулярных выражений php) соответствовать переменному количеству заключенных в скобки подшаблонов?
-
18-09-2019 - |
Вопрос
Предположим, у меня есть '/srv/www/site.com/htdocs/system/application/views/'
и хотите протестировать его с регулярным выражением, которое соответствует каждому имени каталога в пути?
Что - то нравится этот шаблон: '(/[^/])'
Это дает массив с 'srv','www','site.com'...
и т.д.
PS:синтаксис регулярных выражений, который я написал, предназначен просто для иллюстрации, он не проверен и наверняка ошибочен, а просто для того, чтобы дать представление.
PS2:Я знаю, что есть explode()
но давайте посмотрим, сможем ли мы сделать это с помощью регулярного выражения (это полезно для других языков и фреймворков, в которых нет explode).
Решение
$str = '/srv/www/site.com/htdocs/system/application/views/';
preg_match_all('/\/([^\/]+)/', $str, $matches);
// $matches[0] contains matching strings
// $matches[1] contains first subgroup matches
print_r($matches[1]);
Выходной сигнал:
Array
(
[0] => srv
[1] => www
[2] => site.com
[3] => htdocs
[4] => system
[5] => application
[6] => views
)
Другие советы
Есть preg_split
для разделения файлов по регулярным выражениям, подобным explode, а затем есть preg_match_al
l который делает то, что вы хотите.
Я не думаю, что вы можете, но вы могли бы вместо этого использовать preg_match_all() предварительный совпадение_all() чтобы получить несколько совпадений из регулярного выражения.Существует также preg_split() прег_сплит() что может быть более уместно.