import Foundation
let pattern = #"'controllers' => \[\s*\K('factories' => )(\[((?>[^][]++|(?2))*)])"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
<?php
namespace Application;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;
use Laminas\ServiceManager\Factory\InvokableFactory;
return [
'view_manager' => [
'template_path_stack' => [
__DIR__ . '/../view',
__DIR__ . '/../view/Application/_shared'
],
],
'controllers' => [
'factories' => [
dsdsa
]
],
'service_manager' => [
'factories' => [
'UsersTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Laminas\Db\Adapter\Adapter');
$resultSetPrototype = new \Laminas\Db\ResultSet\ResultSet();
//get base url from config
$config = $sm->get('Config');
$baseUrl = $config['view_manager']['base_url'];
//pass base url via cnstructor to the User class
$resultSetPrototype->setArrayObjectPrototype(new Model\Rowset\User($baseUrl));
return new Utils\TableGateway('users', $dbAdapter, null, $resultSetPrototype);
},
'Application\Model\UsersTable' => function($sm) {
$tableGateway = $sm->get('UsersTableGateway');
$table = new Model\UsersTable($tableGateway);
return $table;
},
Utils\Authentication::class => function($sm) {
$auth = new Utils\Authentication(
$sm->get(\Laminas\Db\Adapter\Adapter::class),
$sm->get(Utils\Adapter::class)
);
return $auth;
},
Utils\Helper::class => InvokableFactory::class,
SessionManager::class => function ($container) {
$config = $container->get('config');
$session = $config['session'];
$sessionConfig = new $session['config']['class']();
$sessionConfig->setOptions($session['config']['options']);
$sessionManager = new Session\SessionManager(
$sessionConfig,
new $session['storage'](),
null
);
\Laminas\Session\Container::setDefaultManager($sessionManager);
return $sessionManager;
},
],
],
];
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression