2009-07-21 13 views
5

मैं जावास्क्रिप्ट का उपयोग HTML पृष्ठ में एक स्ट्रिंग की जगह है, लेकिन उपेक्षा यह है, अगर यह एक HTML टैग में है, उदाहरण के लिए करना चाहते हैं:Regex स्ट्रिंग की जगह नहीं बल्कि अंदर HTML टैग

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

मैं द्वारा google बदलना चाहते हैं <b>google</b>, लेकिन यहाँ नहीं:

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

मैं इस एक के साथ करने की कोशिश की:

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

लेकिन समस्या यह है:

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

इसे कैसे ठीक कर सकते हैं: मैं <b>google</b><a> टैग के अंदर मिल गया?

उत्तर

6

आप रेगेक्स के बजाए इसके लिए एक HTML पार्सर का बेहतर उपयोग करेंगे। मुझे यकीन नहीं है कि यह 100% विश्वसनीय रूप से किया जा सकता है।

1

तुम सच है कि, अपने "गूगल" हमेशा कुछ टैग में है, नहीं है या तो सभी या कोई भी

5

आप कर सकते हैं या नहीं एक regexp साथ साथ ऐसा करने में सक्षम हो सकता है बदल सकते हैं। यह इस बात पर निर्भर करता है कि आप शर्तों को कैसे परिभाषित कर सकते हैं। यह कहकर कि आप स्ट्रिंग को प्रतिस्थापित करना चाहते हैं, सिवाय इसके कि अगर यह एक HTML टैग में है, तो यह संकीर्ण नहीं है, क्योंकि पेज पर सब कुछ संभवतः कुछ HTML टैग (बॉडी अगर कुछ और नहीं) में है।

यह एचटीएमएल पर एक regexp का उपयोग करने की कोशिश करने के बजाय शायद इसके लिए डीओएम पेड़ को पार करने के लिए बेहतर काम करेगा।

+1

मैं सहमत हूं। स्ट्रिंग वाले डीओएम में सभी टेक्स्ट नोड्स पाएं। उन टैग्स की एक ब्लैकलिस्ट रखें जिन्हें आप ** स्ट्रिंग को प्रतिस्थापित नहीं करना चाहते हैं। जांचें कि टेक्स्ट नोड इन टैगों में से किसी एक के अंदर है या नहीं। यदि नहीं, तो अपना प्रतिस्थापन करें, अन्यथा इसे छोड़ दें। – tvanfosson

1

एक नियमित अभिव्यक्ति के साथ एचटीएमएल पार्सिंग मामूली मामलों के अलावा किसी अन्य चीज़ के लिए आसान नहीं होगा, क्योंकि एचटीएमएल नियमित नहीं है

अधिक जानकारी के लिए this Stackoverflow question (और उत्तर) देखें।

0

ठीक है, चूंकि सब कुछ एक टैग का हिस्सा है, इसलिए आपके अनुरोध को कोई वास्तविक अर्थ नहीं है। अगर यह सिर्फ <a /> टैग है, तो आप बस उस भाग की जांच कर सकते हैं। मुख्य रूप से यह सुनिश्चित करते हुए आप एक ताजा <a>

1

मुझे लगता है कि आप सब यहाँ सवाल भूल रहे हैं पहले एक पीछा </a> टैग नहीं है ...

वह टैग के अंदर का कहना है, वह उद्घाटन के अंदर का मतलब टैग, < एक href में के रूप में = "google.com" > टैग ... यह कुछ पाठ कहते हैं, की तुलना में काफी अलग, एक < पी > </p > टैग जोड़ी या < शरीर > </शरीर > के अंदर है। जबकि मेरे पास अभी तक जवाब नहीं है, मैं इस समस्या से जूझ रहा हूं और मुझे पता है कि इसे रेगेक्स का उपयोग करके हल करने योग्य होना चाहिए। एक बार जब मैं इसे समझूं, तो मैं वापस आऊंगा और पोस्ट करूंगा।

1

कारगर युक्तियाँ

आप एक HTML पार्सर उपयोग नहीं कर सकते या अपने HTML संरचना के बारे में काफी विश्वास है इस प्रयास करें:

  1. "बुरा" बदलते
  2. दोहराने की जगह कर (< [^>] *) (< [^>] +>) $ 1 कुछ बार (जितना आपको चाहिए)

यह एक है सरल कामकाज, लेकिन मेरे लिए काम करता है।

विपक्ष? खैर ... आप मामले के लिए दो बार की जगह क्या करना है ... ...> यह पृष्ठ पर हर टैग से केवल पहले अवांछित टैग को हटा

[संपादित करें:] के रूप में समाधान

jQuery का उपयोग क्यों नहीं, पेज में एचटीएमएल कोड डाल दिया और कुछ इस तरह करते हैं:

$(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

एक और बात यह है कि यह एक पार्सर नहीं है। – BalusC

+1

हे, मैंने कहा "अगर आप एक पार्सर का उपयोग नहीं कर सकते" - तो हाँ, यह नहीं है – naugtur

0

आपको लगता है कि स्टाइल, स्क्रिप्ट और CDATA तरह REGEX, लेकिन छानने ब्लॉकों का उपयोग कर अधिक काम की आवश्यकता होगी कर सकते हैं, और लागू नहीं किया निम्नलिखित समाधान में।

अधिकांश उत्तरों में कहा गया है कि 'आपका डेटा हमेशा कुछ टैग में होता है' लेकिन वे बिंदु खो रहे हैं, डेटा हमेशा कुछ टैग के बीच होता है, और आप टैग को 'टैग' में फ़िल्टर करना चाहते हैं।

ध्यान दें कि इनलाइन स्क्रिप्ट में टैग वर्णों को तोड़ने की संभावना है, इसलिए यदि वे मौजूद हैं, तो उन्हें इस विधि के साथ अलग-अलग संसाधित किया जाना चाहिए। यहां एक नज़र डालें:
complex html string.replace function

संबंधित मुद्दे