2008-11-18 10 views
7

निकालने मैं इस तरह की परीक्षा के एक स्ट्रिंग है:रेगुलर एक्सप्रेशन से HTML टैग मिलान और पाठ

<customtag>hey</customtag> 

मैं इतना है कि यह इस प्रकार दिखाई देंगे "customtag" टैग के बीच पाठ को संशोधित करने के लिए एक रेगुलर एक्सप्रेशन से उपयोग करना चाहते हैं:

<customtag>hey, this is changed!</customtag> 

मुझे पता है कि मैं पाठ को संशोधित करने के लिए एक MatchEvaluator उपयोग कर सकते हैं, लेकिन मैं उपयोग करने के लिए उचित रेगुलर एक्सप्रेशन से वाक्य रचना की अनिश्चित हूँ। कोई भी सहायताकाफी प्रशंसनीय होगी।

+2

[सर्वश्रेष्ठ उत्तर] (http://stackoverflow.com/a/1732454/80274) । –

उत्तर

15

मैं या तो इस के लिए regex का उपयोग नहीं होगा, लेकिन अगर आप इस अभिव्यक्ति काम करना चाहिए करना चाहिए: <customtag>(.+?)</customtag>

+0

धन्यवाद - यह पूरी तरह से काम किया। आम तौर पर मैं इस तरह एचटीएमएल का विश्लेषण करने के लिए RegEx का उपयोग नहीं करता, लेकिन यह HTML एक आंतरिक प्रणाली से है और ठीक से गठित किया गया है। –

+2

दूसरों को चेतावनी के रूप में: यह ठीक से गठित वाक्यविन्यास पर काम नहीं करेगा। कुछ पाठ | - पाइप प्रतीकों के बीच का क्षेत्र मिलान किया गया है, इसलिए दूसरा बुरी तरह से बनाए गए XML को छोड़कर हटा दिया जाएगा। –

+1

हाँ और यही कारण है कि आपको रेगेक्स के साथ एक्सएमएल पार्स करने की कोशिश नहीं करनी चाहिए। आप टैग के बीच में क्या जा सकते हैं और केवल अक्षर, संख्याओं और रिक्त स्थानों को अनुमति दे सकते हैं और यह थोड़ा बेहतर काम करेगा। लेकिन फिर यह एक विशिष्ट डोमेन तक सीमित है, इसलिए इस तरह कुछ: ([ए-जेए-जेड 0-9]) + Tjofras

7

मैं एचटीएमएल को पार्स करने और बदलने के लिए नियमित अभिव्यक्ति का उपयोग करने से पहले अपना पैर बंद कर दूंगा।

XSL या DOM का उपयोग करें।


दो टिप्पणियों ने मुझे स्पष्टीकरण देने के लिए कहा है। नियमित अभिव्यक्ति प्रतिस्थापन ओपी के प्रश्न में विशिष्ट मामले में काम करता है, लेकिन सामान्य नियमित अभिव्यक्तियों में एक अच्छा समाधान नहीं है। नियमित अभिव्यक्ति regular languages से मेल खा सकती हैं, यानी इनपुट का एक अनुक्रम जिसे एक सीमित राज्य मशीन द्वारा स्वीकार किया जा सकता है। एचटीएमएल में किसी भी मनमानी गहराई में नेस्टेड टैग हो सकते हैं, इसलिए यह नियमित भाषा नहीं है।

इस प्रश्न के साथ क्या करना है? ओपी के प्रश्न के लिए नियमित अभिव्यक्ति का उपयोग करना क्योंकि यह लिखा गया काम है, लेकिन क्या होगा यदि टैग के बीच की सामग्री में अन्य टैग हैं? क्या होगा यदि पाठ में एक शाब्दिक < वर्ण होता है? जॉन टैकबरी ने सवाल पूछने के 11 महीने बाद, और मुझे लगता है कि उस समय, उसकी समस्या की जटिलता में वृद्धि हो सकती है।

नियमित अभिव्यक्तियां बहुत अच्छी हैं और मैं उन्हें हर समय उपयोग करता हूं। लेकिन इनपुट के लिए वास्तविक पार्सर के बदले उनका उपयोग करना, जिसके लिए एक बहुत ही सरल मामलों में काम करने जा रहा है। यह व्यावहारिक रूप से अनिवार्य है कि ये मामले नियमित अभिव्यक्तियों को संभालने से परे बढ़ते हैं। जब ऐसा होता है, तो आप एक और जटिल नियमित अभिव्यक्ति लिखने के लिए लुभाने लगेंगे, लेकिन ये जल्दी से विकसित और डिबग करने के लिए बहुत श्रमिक बन जाते हैं। पार्सिंग आवश्यकताओं का विस्तार करते समय नियमित अभिव्यक्ति समाधान को स्क्रैप करने के लिए तैयार रहें।

एक्सएसएल और डोम एक्सएमएल या एक्सएचटीएमएल मार्कअप के साथ काम करने के लिए डिज़ाइन की गई दो मानक तकनीकें हैं। दोनों प्रौद्योगिकियों को पता है कि संरचित मार्कअप फ़ाइलों का विश्लेषण कैसे करें, नेस्टेड टैग का ट्रैक रखें, और टैग टैग्स या सामग्री को बदलने की अनुमति दें।

यहाँ कैसे के साथ सी # डोम का उपयोग करने पर लेख की एक जोड़ी हैं::

यहाँ कैसे के साथ सी # XSL का उपयोग करने पर लेख की एक जोड़ी हैं

यहां एक है।नेट पुस्तकालय है कि HTML पर डोम और XSL संचालन सहायता करता है:

+0

खैर, मैं उन्हें कभी-कभी, नियंत्रित वातावरण पर, मशीन जेनरेट कोड के साथ उपयोग करता हूं जो एक त्वरित नौकरी के लिए संगत होने के लिए जाना जाता है ... – PhiLho

+4

तो आप हमें क्यों नहीं दिखाते कि इसे XSL या DOM में C# में कैसे किया जाए? व्यापक बयान बनाना आसान है। आइए वास्तविक कोड देखें। रेगेक्स सामान्य HTML को पार्स करने के लिए उपयुक्त नहीं हैं, लेकिन वे विशिष्ट HTML कोड के साथ विशिष्ट चीजों को करने के लिए पूरी तरह उपयुक्त हैं। –

+0

मैं मानता हूं कि आपने मुझे हंसी बना दी है, लेकिन चलो एक स्पष्टीकरण, या एक अच्छा स्पष्टीकरण के लिए एक लिंक है कि आप अपने पैर को क्यों चबाते हैं। मुझे लगता है कि यह वास्तव में स्पष्ट है कि क्यों कुछ प्रोग्रामर, लेकिन शायद नौसिखिया के लिए नहीं? –

1

हैं दो टैग के बीच कोई अन्य टैग नहीं होगा, यह रेगेक्स थोड़ा सुरक्षित है, और अधिक कुशल:

<customtag>[^<>]*</customtag> 
0
//This is to replace all HTML Text 

var re = new RegExp("<[^>]*>", "g"); 

var x2 = Content.replace(re,""); 

//This is to replace all &nbsp; 

var x3 = x2.replace(/\u00a0/g,''); 
0

अधिकांश लोग HTML टेक्स्ट पार्सिंग के लिए HTML Agility Pack का उपयोग करते हैं। हालांकि, मुझे अपनी खुद की जरूरतों के लिए थोड़ा मजबूत और जटिल लगता है। मैं स्मृति में एक वेब ब्राउज़र नियंत्रण बनाते हैं, पेज लोड करते हैं, और इससे टेक्स्ट कॉपी करते हैं। (नीचे उदाहरण देखें)

आप 3 सरल यहाँ उदाहरण मिल सकते हैं: तारीख को इस सवाल का

http://jakemdrew.wordpress.com/2012/02/03/getting-only-the-text-displayed-on-a-webpage-using-c/

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