2015-12-30 4 views
7

मेरे स्ट्रिंग है:जावास्क्रिप्ट में इस नियमित अभिव्यक्ति को पार्स करने में मैं क्या गलत कर रहा हूं?

<div> (blah blah blah) ---> quite big HTML before coming to this line.<b>Train No. &amp; Name : </b></td><td style="border-bottom:1px solid #ccc;font:12px arial"><span>12672/SOUTH TRUNK EXP</span></td> 

मैं रेगुलर एक्सप्रेशन

var trainDetails = new RegExp("<b>Train No. &amp; Name : </b></td><td.*>([0-9][a-z][A-Z]+)</span></td>", "m"); 

लेकिन trainDetails अशक्त हैं या खाली हैं तैयार करने में कामयाब रहे।

मैं बस इतना करना चाहता हूं कि स्पैन तत्व के भीतर ट्रेन का नाम और ट्रेन नंबर प्राप्त करें।

कोई भी पॉइंटर्स जहां मैं गलत कर रहा हूं?

+1

आप अपने दृष्टिकोण में 2 समस्या है '\ /': रेगुलर एक्सप्रेशन वाक्य रचना में, '/' आरक्षित है, और इस तरह से बच गया की जरूरत है। ** मेजर ** मुद्दा यह है कि आप नियमित अभिव्यक्तियों के साथ HTML को पार्स करने का प्रयास कर रहे हैं, जिसे केवल बहुत ही कम अनुशंसा की जाती है। – npinti

+0

@npinti: मैं एक नौसिखिया हूं क्योंकि इंगित करने के लिए धन्यवाद। क्या आप जावास्क्रिप्ट के साथ HTML को पार्स करने के लिए मुझे एक अच्छी विधि सुझा सकते हैं? –

+0

@npinti जबकि मैं regex के साथ _general_ HTML को पार्सिंग के साथ सहमत हूं, यह एक बुरा विचार है, यह उचित है, ज्ञात HTML का एक बहुत ही विशिष्ट सेट जिसे आसानी से रेगेक्स के साथ पार्स किया जाता है। –

उत्तर

4

यह मेरे लिए काम किया:

RegExp

string = '<div> (blah blah blah) ---> quite big HTML before coming to this line.<b>Train No. &amp; Name : </b></td><td style="border-bottom:1px solid #ccc;font:12px arial"><span>12672/SOUTH TRUNK EXP</span></td>'; 

var trainDetail = string.replace(new RegExp(".*?([^\>]+)(?:\<\/[A-z]+\>)+$","g"), '$1'); 

का उपयोग डोम

string = ('<b>Train No. &amp; Name : </b></td><td style="border-bottom:1px solid #ccc;font:12px arial"><span>12672/SOUTH TRUNK EXP</span></td>'); 
string = string.replace(new RegExp('(<\/?)td', 'g'), '$1xmltd'); 
tempDoc = document.createElement('xml'); 
tempDoc.innerHTML = string; 
node = tempDoc.getElementsByTagName('xmltd'); 
trainDetails = node[node.length-1].textContent; 

का उपयोग करते हुए इस शर्त पर कि स्ट्रिंग में "< टीडी >" पिछले ट्रेन विस्तार है मान लें।

+0

@now वह जिसे नाम नहीं दिया जाना चाहिए। क्या यह काम करता है? – Vegeta

+0

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

+0

मेरे उपयोग के मामले में, इस HTML से पहले कई वर्ण हैं। उस मामले में कैसे आगे बढ़ें? (Pls। संपादन देखें) –

1

यह ठीक होना चाहिए: .+\<span>(.+)\<\/span>.+ समूह # 1 को पकड़ें और आपको यह मिल जाएगा।

+0

यहां हम जाते हैं, फिर भी पहले समूह को पकड़ें:/.+ ट्रेन नं। + \ (। +) \ <\/span\>/ –

+0

परिणाम देखें: https://www.debuggex.com/r/aoK0s3hspZ1DMsnr –

+0

बहुत बहुत धन्यवाद:) मैं धीरे-धीरे इसे समझना शुरू कर रहा हूं। –

4

नियमित अभिव्यक्ति इस उपयोग-मामले के लिए आदर्श समाधान नहीं है। मैं <span> के आंतरिक HTML प्राप्त करने के लिए अपने ब्राउज़र के अंतर्निहित HTML पार्सर का उपयोग करने का सुझाव देता हूं।

var el = document.createElement('html'); 
el.innerHTML = '<div> (blah blah blah) ---> quite big HTML before coming to this line.<b>Train No. &amp; Name : </b></td><td style="border-bottom:1px solid #ccc;font:12px arial"><span>12672/SOUTH TRUNK EXP</span></td>'; 
var output = el.getElementsByTagName('span')[0].innerHTML; 

उत्पादन चर का मान हो जाता है:

12672/SOUTH TRUNK EXP 

संपादित

आप एक विशिष्ट <span> में रुचि रखते हैं, मैं अपनी टैग या एक वर्ग को जोड़ने का सुझाव इसके माता-पिता <td> टैग, उदाहरण:

<span class="train-number-and-name"> 
    12672/SOUTH TRUNK EXP 
</span> 

और यह लाने इस तरह: 1::

var output = el.querySelector('span.train-number-and-name').innerHTML; 
संबंधित मुद्दे