2008-10-07 4 views
5

मैं एक खोज परिणाम पृष्ठ के लिए कोड लिख रहा हूं जिसे खोज शब्द को हाइलाइट करने की आवश्यकता है। शर्तें तालिका कक्षों के भीतर होती हैं (ऐप ग्रिड व्यू पंक्ति कोशिकाओं के माध्यम से पुनरावृत्ति कर रहा है), और इन तालिका कक्षों में HTML हो सकता है।एचटीएमएल टैग के भीतर क्या है, उसे छोड़कर पाठ का मिलान कौन करेगा?

वर्तमान में, मेरी कोड इस (प्रासंगिक नीचे दिखाया गया है जिसे) की तरह दिखता है:

const string highlightPattern = @"<span class=""Highlight"">$0</span>"; 
DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0]; 

// Turn "term1 term2" into "(term1|term2)" 
string spaceDelimited = txtTextFilter.Text.Trim(); 
string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries)); 
string searchPattern = "(" + pipeDelimited + ")"; 

// Highlight search terms in Customer - Comments column 
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase); 

आश्चर्यजनक यह काम करता है।

<span class="CustomerName">Fred</span> was a classy individual. 

और अगर आप "वर्ग" के लिए खोज मैं प्रकाश डाला कोड "उत्तम दर्जे का" में "वर्ग" रैप करने के लिए लेकिन निश्चित रूप से नहीं करना चाहता: लेकिन, कभी कभी पाठ मैं पर मिलान कर रहा हूँ HTML कि इस तरह दिखता है है HTML विशेषता "कक्षा" जो वहां होती है! यदि आप "फ्रेड" की खोज करते हैं, तो इसे हाइलाइट किया जाना चाहिए।

तो एक अच्छा रेगेक्स क्या है जो सुनिश्चित करेगा कि मैच केवल HTML टैग के बाहर ही होगा? यह सुपर कट्टर होने की जरूरत नहीं है। बस यह सुनिश्चित करना कि मैच < के बीच नहीं है और> ठीक काम करेगा, मुझे लगता है।

+1

अगर किसी ने आपके उदाहरण में फ्रेड की खोज की है तो इसे हाइलाइट किया जाना चाहिए? –

+0

हां। पूछने के लिए धन्यवाद। अच्छा प्रश्न। मैं सवाल संपादित करूंगा। – Chris

उत्तर

11

इस रेगेक्स को नौकरी करना चाहिए: (?<!<[^>]*)(regex you want to check: Fred|span) यह जांचता है कि रेगेक्स <[^>]* मिलान करने वाली स्ट्रिंग से पिछड़ी बार चलना असंभव है।

संशोधित नीचे कोड:

const string notInsideBracketsRegex = @"(?<!<[^>]*)"; 
const string highlightPattern = @"<span class=""Highlight"">$0</span>"; 
DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0]; 

// Turn "term1 term2" into "(term1|term2)" 
string spaceDelimited = txtTextFilter.Text.Trim(); 
string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries)); 
string searchPattern = "(" + pipeDelimited + ")"; 
searchPattern = notInsideBracketsRegex + searchPattern; 

// Highlight search terms in Customer - Comments column 
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase); 
+0

Google के माध्यम से मिला, बहुत मदद की, धन्यवाद! :) – Teekin

+0

बहुत बहुत धन्यवाद! आपने मेरा दिन बचा लिया! :) – podeig

+2

यह कोड का एक बड़ा टुकड़ा है। आपको मिलने से बहुत अधिक वोट मिलते हैं। बहुत बहुत धन्यवाद। – draconis

2

आप संतुलन समूहों और बैक्रेरेंस के साथ एक रेगेक्स का उपयोग कर सकते हैं, लेकिन मैं दृढ़ता से अनुशंसा करता हूं कि आप यहां parser का उपयोग करें।

0

हम्म, मैं सी # प्रोग्रामर नहीं हूं इसलिए मुझे इसका उपयोग करने वाले रेगेक्स का स्वाद नहीं पता है, लेकिन (? <। +?>) टैग के अंदर कुछ भी अनदेखा करना चाहिए। यह आपको अपने एचटीएमएल कोड में & # 60 & # 62 का उपयोग करने के लिए मजबूर करेगा, लेकिन आपको वैसे भी ऐसा करना चाहिए।

+0

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

+0

रेगेक्स "(?! <.+?>)" सिर्फ एक नकारात्मक दिखना है; यह कहता है, "इस स्थिति से, हम उस चीज़ को नहीं देख रहे हैं जो एक टैग की तरह अस्पष्ट दिखता है।" यह किसी भी चीज़ से मेल नहीं खाएगा, न ही यह टैग या आउट के अंदर कुछ भी मिलान करने से रोक देगा। –

0

एक regex कि CDATA भाग संभाल कर सकते हैं लेखन कठिन होने जा रहा है। अब आप यह नहीं मान सकते कि> एक टैग बंद कर देता है।

उदाहरण के लिए

, "<span class="CustomerName>Fred.</span> is a good customer (<![CDATA[ >10000$ ]]>)"

समाधान (जैसा कि पहले उल्लेख किया है) एक पार्सर। CDATA में आपको मिली गड़बड़ी से निपटने में वे बहुत बेहतर हैं। ]]> से <![CDATA से <![CDATA को खोजने के लिए मैडोगोम की पिछली जांच का उपयोग नहीं किया जा सकता है, क्योंकि CDATA अनुभाग में शाब्दिक <![CDATA शामिल हो सकता है।

+0

अच्छा बिंदु, मैंने इसके बारे में नहीं सोचा है। –

+0

मुझे पता है कि समाधान सही नहीं है, लेकिन सभी अप और डाउन का वजन, यह अब तक का सबसे अच्छा है। – Chris

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