Kök göreli bağlantı ile göreli bağlantı yerine Regex

2 Cevap php

Ben (Göreli, mutlak, kök-göreli) tüm bağlantıların farklı tipleri ile html içeren bir metin bir dize var. I preg_replace diğer bağlantıların herhangi dokunmadan, kök-göreceli bağlantıları ile tüm göreli bağlantıları yerine PHP'nin idam edilebilir bir regex gerekir. Zaten kök yolu var.

Değiştirilen bağlantılar:

<tag ... href="path/to_file.ext" ... >   --->   <tag ... href="/basepath/path/to_file.ext" ... >
<tag ... href="path/to_file.ext" ... />   --->   <tag ... href="/basepath/path/to_file.ext" ... />

El değmemiş bağlantılar:

<tag ... href="/any/path" ... >
<tag ... href="/any/path" ... />
<tag ... href="protocol://domain.com/any/path" ... >
<tag ... href="protocol://domain.com/any/path" ... />

2 Cevap

Sadece temel tanım değiştirmek isterseniz, BASE elemanı deneyebilirsiniz:

<base href="/basepath/">

Ama taban URI değişen all göreli tanım ve sadece göreli URI yolları etkiler unutmayın.

Gerçekten düzenli ifade kullanmak istiyorsanız Aksi takdirde, istediğiniz gibi göreceli bir yol türü path-noscheme olması gerektiğini düşünün (bkz. RFC 3986):

path-noscheme = segment-nz-nc *( "/" segment )
segment       = *pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                ; non-zero-length segment without any colon ":"
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded   = "%" HEXDIG HEXDIG
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Yani URI başlaması eşleşmesi gerekir:

^([a-zA-Z0-9-._~!$&'()*+,;=@]|%[0-9a-fA-F]{2})+($|/)

Ama dışarı HTML bir yapı, bir DOM ayrıştırma için uygun bir HTML çözümleyici kullanın lütfen. Sonra href almak için DOM sorgulamak nitelikleri ve yukarıdaki düzenli ifade ile değeri test edebilirsiniz.

Ben bu ile geldi:

preg_replace('#href=["\']([^/][^\':"]*)["\']#', $root_path.'$1', $html);

Biraz çok basit olabilir. Gördüğüm bariz kusur dışında bir etiket olduğunda da href="something" maç olacak, ama umarım başlamış alabiliriz.