Potriviri multiple într-un singur șir/linie cu preg_match (Programare, Php, Regex, Preg Match)

Devon a intrebat.

Încerc să potrivesc toate aparițiile lui {$ceva} într-un șir de caractere.

Un exemplu de șir ar fi:

Hello {$test} World

Care funcționează bine cu:

^.*{$(.*?)}.*$

sau

preg_match("/^.*{$(.*?)}.*$/", $input_line, $output_array);

Dar cum pot să fac o buclă astfel încât să recuperez toate corespondențele, de exemplu, dacă am:

Hello {$test} World {$done}

Se recuperează doar ultima potrivire în matrice:

Array
(
    [0] => Hello {$test} World {$done}
    [1] => done
)

1 răspunsuri
anubhava

Utilizați preg_match_all cu regex-ul corect pentru a obține toate meciurile cu: {$...} model

preg_match_all("/{$([^}]*)}/", $input_line, $output_array);

Apoi iterați prin (proces) $output_array[1].

Comentarii

  • Minunat, voi cerceta puțin regex-ul tău pentru a vedea cum funcționează. –  > Por Devon.
  • Note secundare: parantezele curly nu trebuie să fie scăpate, iar dacă OP nu vrea să aibă de-a face cu grupurile de potrivire, poate folosi lookarounds: (?<={[$])[^}]*(?=}) (explicație/exemplu). –  > Por Sam.
  • Bine, puteți explica ce face acest lucru? [^}] –  > Por Devon.
  • @Devon care se potrivește cu totul în afară de a } ([] este o clasă de caractere și ^ o anulează). Acest lucru este preferat la .*? pentru că în loc de a spune „se potrivește leneș cu 0+ caractere”, se spune „se potrivește cu orice MAI puțin decât }„. TLDR: mai specific –  > Por Sam.