Html etiketleri içinde dışında dize2 ile string1 yerine regex, OR (html dışında) bir url bir parçası olarak

1 Cevap php

Ben HTML büyük bloklar üzerinde arama yapmak ve değiştirme işlemleri için bir ihtiyaç var. Ben (URL'ler gibi) bir html etiketi parçası olan şeyi değiştirmek istemiyorum - Ben de html etiketleri DIŞ adresler değiştirmek istemiyorum. Ben html içinde olmayan bir kelime eşleştirme için kısmi bir çözüm var (src):

 word(?!([^<]+)?>)

regex dostum da bu aynı maç olacağını söylerken:

 (?!([^<]+)?>)word

bu yüzden, yapılacak tek şey sol bu kelime bir url gibi görünen bir dize parçası olmadığından emin olun - bu böyle:

(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$]

Bu mümkün ise emin değilim, amacım arama ve başka bir şey operasyonları değiştirin izin verirken, metinde mevcut, ve içeriğin html parçası olan adresler korumak için:

Ideal çözüm KÖPEK maç ve aşağıda gösterildiği gibi CAT ile yerini alacak

<h1>DOG</h1> -> <h1>CAT</h1>
<h1 class='DOG'>DOG</h1> -> <h1 class='DOG'>CAT</h1>

<p class='DOG'>DOG: http://www.DOG.com/DOGfood.html DOGfood is delicious.</p> -> <p class='DOG'>CAT: http://www.DOG.com/DOGfood.html CATfood is delicious.</p>

Verimlilik için bonus puan, benim fikir sonunda neredeyse duyuyorum.

1 Cevap

Bir etiketi "KÖPEK" eşleşen gelince: ben genel olarak nasıl yapacağını, ama onun yerine bu regex kullanabilirsiniz:

DOG(?![^<>]++>)

[^<>]++ bir açı ayraç değil şey bir veya daha fazla eşleşen possessively. Sonra bitti sonraki şey değilse, '>' derhal hatası bildiriyor - hayır geriye gidilmiştir. Bundan daha verimli olamıyorum.

Ancak, bir URL içinde olup olmadığınızı belirlemek için bir Geriye İlerleme kullanarak sizin fikir çalışmaz. Bu bir değişken uzunlukta Geriye bakan maç gerektirir, ve PHP bu desteklemiyor - çok az regex lezzetleri yapmak.

Ben bunun yerine bir münavebe-tabanlı yaklaşımı öneriyoruz. Tek bir regex, tam bir HTML etiketi, tam bir URL veya sözcük ya maç:

<[^<>]++>
|
(https?|ftp|file)://[A-Z0-9+&@#/%?=~_|$]++(?:[?!:,.;-]++[A-Z0-9+&@#/%=~_|$]++)*+
|
DOG

preg_replace_callback regex uygulamak için kullanın ve geri arama bunu eşleşen ne kontrol. Bir etiket ya da bir URL ise, onu geri takın; o "KÖPEK" ise size "CAT" ile değiştirin.

Bu dosyada her açılı ayraç bir HTML etiketi parçasıdır varsayar. Dosyalarınızı SGML yorumlarınızı içerebilir varsa, HTML etiketleri için before biri, onlar için bir alternatif eklemek gerekecek. Aynı CDATA bölümleri için de geçerlidir. Ve tabii ki, nitelik değerleri çok açılı parantez içeren izin verilir. Bu benim deneyim son derece nadir, ama gerekirse o da ele alınabilir.