Sadece eğlence için burada çalışacak bir regex olan bir tek preg_match_all
:
'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`
Ya da, daha okunabilir bir biçimde:
'%(?:
Filed under: # your sentinel string
|
\G # NEXT MATCH POSITION
</a> # an end tag
)
[^<>]*+ # some non-tag stuff
<a[^<>]*+> # an opening tag
\K # RESET MATCH START
[^<>]+ # the tag's contents
%x'
\G
Bir sonraki maç girişimi genellikle önceki başarılı maç sona erdi (ancak önceki maç sıfır uzunlukta ise, önümüzdeki bir daha darbe) nokta olan başlamak istiyorum konumunu eşleşir. İşte after en az bir kez Filed under:
ile başlayan biri eşleşti olana kadar regex </a>
ile başlayan bir alt dize maç olmayacak anlamına gelir.
Nöbetçi dize veya bir bitiş etiketi eşleşti sonra, [^<>]*+<a[^<>]*+>
için her şeyi tüketir ve bir sonraki başlangıç etiketi dahil. Maç (eğer varsa) <a>
etiketi (bu olumlu Geriye İlerleme gibi, ama daha esnek) sonra başlamak görünür böylece daha sonra \K
başlangıç konumunu taklit. Son olarak, [^<>]+
etiketinin içeriğini eşleşir ve bitiş etiketi için maç konumunu getirir böylece \G
eşleşebilir.
Ama dediğim gibi, bu sadece eğlence için olduğunu. Eğer have bir regex işi yapmak istemiyorsanız, kullandığınız codaddict @ gibi bir çok adım yaklaşım ile daha iyi; Bu, daha okunabilir, daha esnek ve daha rahat bulunuyor.
\K
reference
\G
reference
EDIT: Ben verdiği referanslar Perl dokümanlar için olsa da, bu özellikleri are da, PHP tarafından desteklenen - PCRE lib tarafından, daha doğru, ya da. Ben Perl docs biraz daha iyi olduğunu düşünüyorum, ama aynı zamanda PCRE manual bu şeyler okuyabilirsiniz.