Necessita de regex para analisar palavra-chave = 'valor' com aspas simples ou duplas
-
12-09-2019 - |
Pergunta
Estou tendo dificuldade para escrever uma expressão regular (adequado para preg_match () do PHP) que irá analisar palavra-chave = pares de 'valor', independentemente de o
name="value"
name='value'
Solução
Em Perl esta é uma expressão regular que iria funcionar. Combinava primeira para o início da linha, em seguida, corresponde a um ou mais não = personagens e define-los para $ 1. Em seguida, ele procura os = então os a não parênteses com uma escolha de correspondência de "ou" e define que para $ 2.
/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/
Se você queria para coincidir com expressões em branco como.
Este = ""
Substitua os dois últimos + com * Caso contrário, isso deve funcionar
Editar Como mencionado nos comentários. Doug usado ...
/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
Isso irá corresponder a um espaço em branco no final opcional éter de entrada ou o valor e ele removeu o marcador de fim de linha.
Outras dicas
/^(\w+?)=(['"])(\w+?)\2$/
O que vai colocar a chave na $1
eo valor em $3
.
Alguns anos mais tarde, mas uma vez que esta questão é altamente classificado no Google, e as respostas não satisfazer as minhas necessidades, aqui está uma outra expressão :
(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2
Isso irá corresponder aspas simples ou duplas, tendo em conta escapou citações, e os valores não cotados.
name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""
É, no entanto, tem uma limitação no que se um valor está faltando a chave do próximo par chave / valor é lido. Isso pode ser resolvido usando um lista separada por vírgulas de pares chave / valor.