J'essaie d'obtenir 3 correspondances d'une chaîne comme celle-ci, séparées par des deux-points:

{{text:1:{"a":"b"}}}

Résultat désiré:

match[1] = text
match[2] = 1
match[3] = {"a":"b"}

En utilisant le modèle de recherche suivant:

\{\{(.\*?):(.\*?):(.\*?)\}\}

Malheureusement, le résultat est

match[1] = text
match[2] = 1
match[3] = {"a":"b"

Comment puis-je limiter l'expression régulière à la recherche uniquement dans le {{}} externe?

2
shuunenkinenbi 20 nov. 2018 à 23:20

3 réponses

Meilleure réponse

Essayez de supprimer le ?

Comme ça: {{(.*?):(.*?):(.*)}}

Group 1: text

Group 2: 1

Group 3: {"a":"b"}
3
dustinos3 20 nov. 2018 à 20:24
<?php 
$text='{{text:1:{"a":"b"}}}';
preg_match_all("~{{(.*?):(.*?):({.*?})}}~",$text,$match);
print_r($match);

/*output

Array
(
    [0] => Array
        (
            [0] => {{text:1:{"a":"b"}}}
        )

    [1] => Array
        (
            [0] => text
        )

    [2] => Array
        (
            [0] => 1
        )

    [3] => Array
        (
            [0] => {"a":"b"}
        )

)
*/
0
Mahfuzar Rahman 20 nov. 2018 à 20:38

Le problème dans votre cas spécifique est le dernier ? du modèle, empêchant une correspondance gourmande pour le troisième groupe, donc il s'arrête au premier }} après le deuxième :. Comme alternative, vous pouvez ajouter un $ à la fin (et éventuellement un ^ au début), si la chaîne à rechercher se termine toujours (et commence) par des doubles accolades.

1
nix 20 nov. 2018 à 20:26