import Foundation
let pattern = #"(?<!\{)\{([^\s}]+)\}(?!\})"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
<?php
return
[
'server'=> [
'host'=> 'smtp.saluddigital.net',
//'helo'=> url('domain'),
'username'=> 'php7@saluddigital.net',
'password'=> 'x5~JkKU+X(NY4R$C',
'port'=> '25',
'charset'=> '{\web.charset}',
],
'mails'=> [
// Para especificar varias direcciones, separarlas por comas
// Para especificar un nombre para una dirección, usamos el formato
// estándard nombre <email>, <email>.
// Ejemplos:
// 'jatubio@saluddigital.net'
// 'Andrés Pozo <apozo@saluddigital.net>, ergon@saluddigital.net'
//
// Usar {domain} para sustituirlo por el dominio actual
'default'=> [
'asunto'=> '{\web.titulo}',
'from'=> '{\web.titulo} <info@[url domain]>',
'replyto'=> '',
// Poner siempre en copia
'cc'=> '',
// Poner siempre en copia oculta
'cco'=> '',
// Direcciones para enviar la copia de administración
'admin'=> 'jatubio@saluddigital.net',
// Activar/Desactivar la copia de administración
'adminsend'=> true,
// Enviar una copia si está activado el flag de debug
'debug'=> 'jatubio@saluddigital.net',
// Activar/Desactivar la copia de debug
'debugsend'=> true,
// Modificar alguna de las opciones anteriores si cumple el filtro
'filtros'=> [
'paises'=> [
'filtro'=> [
'Pais'=>'España',
],
'opciones'=> [
'asunto'=>'Hola desde España',
],
],
],
],
// Formulario de contacto
'contacto'=> [
'asunto'=> 'Contacto desde {\web.titulo}',
'from'=> '{\web.titulo} <contacto@[url domain]>',
// Campos a incluir en el [repetir datos]
// Si está vacío, se incluyen todos
'campos'=> ['Nombre', 'Apellidos', 'Telefono', 'EMail', 'Pais', 'Curso', 'Comentario'],
'campoTo' => 'Nombre <EMail>',
//template=> 'contacto',
],
],
'templates'=> [
'base'=>'General',
],
];
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Ejemplos
//--------------------------------------------------------------------
//--------------------------------------------------------------------
return
[
'server'=> [
'host'=> 'smtp.saluddigital.net',
'helo'=> url('domain'),
'username'=> 'php7@saluddigital.net',
'password'=> 'x5~JkKU+X(NY4R$C',
'port'=> '25',
'charset'=> '{\web.charset}',
],
// Para especificar varias direcciones, separarlas por comas
// Para especificar un nombre para una dirección, usamos el formato
// nombre=>email.
// Ejemplos:
// 'jatubio@saluddigital.net'
// 'Andrés Pozo=>apozo@saluddigital.net, ergon@saluddigital.net'
'default'=> [
'asunto'=> '{\web.titulo}',
'from'=> '{\web.titulo}=>info@[url domain]',
'replyto'=> '',
// Poner siempre en copia
'cc'=> '',
// Poner siempre en copia oculta
'cco'=> '',
// Direcciones para enviar la copia de administración
'admin'=> 'jatubio@saluddigital.net',
// Activar/Desactivar la copia de administración
'adminsend'=> true,
// Enviar una copia si está activado el flag de debug
'debug'=> 'jatubio@gmail.com',
// Activar/Desactivar la copia de debug
'debugsend'=> true,
// Modificar alguna de las opciones anteriores si cumple el filtro
'filtros'=> [
'paises'=> [
'filtro'=> [
'Pais'=>'España',
],
'opciones'=> [
'asunto'=>'Hola desde España',
],
],
'cursos' => [
'filtro'=> [
'Curso'=>'Consulta General',
],
'opciones'=> [
'cco'=>'consultas@gmai.com',
],
]
],
],
// Formulario de contacto
'contacto'=> [
'asunto'=> 'Contacto desde {\web.titulo}',
'from'=> '{\web.titulo} <contacto@[url domain]>',
'filtros'=> [
'paises'=> [
'filtro'=> [
'Pais'=>'Costa Rica, Francia, Perú',
],
'opciones'=> [
'asunto'=>'Hola desde Costa Rica',
'from'=> '{\web.titulo
} <costarica@[url domain]>',
],
'activo'=> false,
],
'casos'=> [
'filtro'=> [
'NumCaso'=>'1, 8, 10',
],
'opciones'=> [
'{{asunto}}'=>'Consulta sobre un caso',
'cc'=> 'especialista@gmail.com',
],
],
'cursos'=> [
'activo'=> false,
]
],
],
];
"""#
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