PHP RegEx gruplandırma Çoklu Maçlar

3 Cevap php

Ben sadece benim ilk regex işçiliği elimi çalışıyorum. Ben bir sözde HTML öğesi eşleştirmek ve etiket adı gibi yararlı bilgiler elde edebilmek istiyorum, vb nitelikleri:

$string = '<testtag alpha="value" beta="xyz" gamma="abc"  >';

if (preg_match('/<(\w+?)(\s\w+?\s*=\s*".*?")+\s*>/', $string, $matches)) {
    print_r($matches);
}

Ben alıyorum, hariç:

Array ( [0] =>  [1] => testtag [2] => gamma="abc" )

Herkes ben diğer özelliklerini nasıl alabilirim biliyor musun? Ne eksik?

3 Cevap

Bu normal ifade deneyin:

/<(\w+)((?:\s+\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s]*))*)\s*>/

Ama gerçekten HTML gibi bir bağlam ücretsiz dil için normal ifadeler kullanmak gerekir. Yerine gerçek bir ayrıştırıcı kullanın.

Söylendiği gibi, don't use RegEx for parsing HTML documents.

Yerine bu PHP çözümleyici deneyin: http://simplehtmldom.sourceforge.net/

Sizin ikinci yakalayan grup bir anda nitelikleri biri, öncekinin üzerine yazarak her zaman eşleşir. Eğer. NET Regexes kullanılarak olsaydı, tek yakalar almak için yakalar dizi kullanabilirsiniz, ama ben bu özelliği olan başka bir regex lezzet bilmiyorum. Genellikle bireysel niteliklerini patlak yakalanan metin üzerinde başka bir regex kullanmak, daha sonra bir grup özniteliklerin yakalama tüm gibi bir şey yapmak zorunda.

Insanların sevgi regexes ya eğilimindedir ya da (ya da her ikisi) nefret nedeni budur. Onlarla bazı şaşırtıcı şeyler yapabilirsiniz, ama aynı zamanda bu gülünç zor biri, imkansız değilse gibi basit görevleri içine çekiliyorum.