bir xml benzeri özelliğidir dizesini ayrıştırmak için preg_match_all

3 Cevap php

Ben şöyle bir dize var:

option_alpha="value" option_beta="some other value" option_gamma="X" ...etc.

Ben isim onları ayrıştırmak için kullanıyorum ve ben değer çiftleri:

preg_match_all("/([a-z0-9_]+)\s*=\s*[\"\'](.+?)[\"\']/is", $var_string, $matches)

Boş bir öznitelik değeri karşılaştığında sürece, çalışıyor hangisi:

option_alpha="value" option_beta="" option_gamma="X"

Ne benim regex yanlış yaptım?

3 Cevap

[\"\'](.+?)[\"\']

olmalıdır

[\"\'](.*?)[\"\']

* instead of +. İlk (yani o ne ihtiyaç, ihmal edilebilir) önceki ifadede ne olursa olsun olaylar sıfır olması anlamına gelir. Bu ikinci aracı vardır has to be at least one.

Diğer cevaplar burada ifadenin ortasında değiştirmeniz gerekir ki haklısın, ama ben [^ \ "\ '] * anlamına gelen" a ", 0 veya daha fazla kez olmayan herhangi bir karakter. Bu sayede onu değiştirmek istiyorsunuz greediness "olması gerektiği daha fazla maç ve" boş olanak vermez.

your expression becomes
"/([a-z0-9_]+)\s*=\s*[\"\'][^\"\']*[\"\']/is"

Eğer [\ W_] için [a-z0-9_] değiştirebilirsiniz unutmayın ki olur da büyük harf karakterleri için.

Sana (.*?) için (.+?) sizin ifade çok orta değiştirmek istiyorum düşünüyorum. Bunun yerine en az bir karakter üzerinde olmayan bir açgözlü maç, o (hiçbir karakter dahil) herhangi bir karakteri olmayan bir açgözlü bir maç yapar.

preg_match_all("/([a-z0-9_]+)\s*=\s*[\"\'](.*?)[\"\']/is",$var_string,$matches);