2009-07-21 22 views
5
Ben örneğin bir HTML etiketi ise, onu JavaScript kullanarak HTML sayfasına bir dize yerine ancak görmezden istiyorum

: Ben tarafından google değiştirmek istiyorRegex dize yerine ancak iç html etiketi

<a href="google.com">visit google search engine</a> 
you can search on google tatatata... 

<b>google</b>, ama burada değil:

<a href="google.com">visit google search engine</a> 
you can search on <b>google</b> tatatata... 

Bunu ile çalıştı:

regex = new RegExp(">([^<]*)?(google)([^>]*)?<", 'i'); 
el.innerHTML = el.innerHTML.replace(regex,'>$1<b>$2</b>$3<'); 

ama sorun:

<a href="google.com">visit <b>google</b> search engine</a> 
you can search on <b>google</b> tatatata... 

Bu nasıl düzeltebilirim: Ben <a> etiketinin içine <b>google</b> var?

cevap

6

Bunun için bir html ayrıştırıcısı kullanmanız gerekir, bunun yerine regex. % 100 güvenilir bir şekilde yapılabileceğinden emin değilim.

1

Eğer gerçekten sizin "google" bazı etiketi daima, bunu, ya hep ya hiç Olabilir veya bir Normal ifadeyle ile yapmak mümkün olmayabilir

5

yerini alamaz. Koşulları tam olarak nasıl tanımlayacağınıza bağlıdır. Bir HTML etiketinde yer alması haricinde dizenin değiştirilmesini istediğinizi söylediğinizde, sayfadaki her şey muhtemelen bir HTML etiketinde olduğundan (başka bir şey yoksa BODY).

Bu, HTML'de bir regexp kullanmaya çalışmak yerine bunun için DOM ağacını taşımak için daha iyi çalışır.

+1

Katılıyorum. Dizinde, dizgiyi içeren tüm metin düğümlerini bulun. İçinde ** dizini değiştirmek istemediğiniz bir etiket kara listesini saklayın. Metin düğümünün bu etiketlerden birinin içinde olup olmadığını kontrol edin. Aksi takdirde, değişiminizi yapın, aksi halde olduğu gibi bırakın. – tvanfosson

1

HTML'yi normal bir ifade ile ayrıştırma, önemsiz durumlardan başka hiçbir şey için kolay olmayacaktır, çünkü HTML düzenli değil.

Daha fazla ayrıntı için bkz this Stackoverflow question (ve yanıtları).

0

Her şey bir etiketin parçası olduğu için isteğinizin gerçek bir anlamı yoktur. Yalnızca <a /> etiketi varsa, yalnızca o bölümü kontrol edebilirsiniz. Ağırlıklı olarak emin olarak size

o etiketinin içinde diyor

, o açıklıktan içeri demektir ... Hepinizin burada soruyu eksik düşünüyorum taze <a>

1

önce atık </a> etiketi yok etiketi, < a href olduğu gibi = "google.com" > etiket ... Bu <p> </p > etiketi çifti veya < vücuda > </beden > içindeki metnin, diyelim çok farklı bir şeydir. Henüz bir cevaba sahip olmamamla birlikte, aynı sorunla mücadele ediyorum ve bunun regex kullanarak çözülebilir olması gerektiğini biliyorum. Bir kere anladım, geri dönüp göndereceğim.

1

Pratik Çözüm

Bunu denemek html ayrıştırıcı kullanmak veya Sizin html yapısı hakkında oldukça eminiz yapamıyorsanız: (

  1. tekrar yerine değişen "kötü" do < [^>] *) (< [^>] +>) $ 1 birkaç kez (ihtiyacınız kadar)

Bu bir basit bir çözüm, ama benim için çalışıyor.

Cons? Şey ... Dava için iki kez değiştirmek yapmak zorunda ... ...> o sayfadaki her etiketinden

[edit:] sadece ilk istenmeyen etiketi kaldırır olarak ÇÖZÜM

jQuery kullanmayın Neden, sayfaya html kodunu koymak ve böyle bir şey yapmak:

$(containerOrSth).find('a').each(function(){ 
if($(this).children().length==0){ 
$(this).text($(this).text().replace('google','evil')); 
}else{ 
//here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help 
} 
}); 
+0

Başka bir con, bunun bir ayrıştırıcı olmamasıdır. – BalusC

+1

Hey, "Bir çözümleyici kullanamazsan" dedim - evet, değil – naugtur

0

Sen STİL, SCRIPT ve CDATA'da gibi REGEX ancak filtreleme blokları kullanarak daha fazla çaba gereklidir bunu, ve uygulanan olamaz aşağıdaki çözümde.

Yanıtların çoğu 'verilerinizin her zaman bazı etiketlerde' olduğunu belirtir, ancak noktayı kaçırırlar, veriler her zaman 'arasında' bazı etiketlerdir ve bir etiketin 'içinde' olduğu yeri filtrelemek istersiniz.

Satır içi komut dosyalarındaki etiket karakterlerinin büyük olasılıkla bu durumun kırılacağını unutmayın, yani varsa, bu yöntemle ayrı ayrı işlenmelidirler. Buraya bir göz atın:
complex html string.replace function