2009-05-04 11 views
5

मैं इस समस्या की जांच कर रहा हूं जो कि जितना अधिक मैं गहराई से खो देता हूं उतना ही खराब हो जाता है।जावास्क्रिप्ट स्ट्रिंग स्प्लिट में नियमित अभिव्यक्ति, ब्राउज़र संगतता समस्या

मैं मासूम पर्याप्त शुरू कर दिया एचटीएमएल 'br' टैग पर एक स्ट्रिंग विभाजित करने के लिए इस अभिव्यक्ति का उपयोग करने की कोशिश कर:

T = captions.innerHTML.split(/<br.*?>/g); 

इस उदाहरण के साथ हर ब्राउज़र (FF, सफारी, क्रोम) में काम करता है, IE7 और IE8 को छोड़कर इस तरह इनपुट पाठ:

is invariably subjective. <br /> 
The less frequently used warnings (Probably/Possibly) <br /> 

कृपया ध्यान दें कि उदाहरण के लिए पाठ से पहले '/' एक अंतरिक्ष शामिल है, और एक नई लाइन के पहले आता है।

निम्नलिखित हर ब्राउज़र में सभी HTML टैग से मेल खाएगी दोनों: (मेरे लिए कम से कम)

T = captions.innerHTML.split(/<.*?>/g); 
T = captions.innerHTML.split(/<.+?>/g); 

हालांकि, आश्चर्यजनक रूप से, इस एफएफ और क्रोम में काम नहीं करता है:

T = captions.innerHTML.split(/<br.+?>/g); 

संपादित करें:

यह (नीचे दिए गए प्रतिक्रियाओं में कई बार सुझाया गया है) आईई 7 या 8:

पर काम नहीं करता है
T = captions.innerHTML.split(/<br[^>]*>/g); 

(यह क्रोम और एफएफ पर काम किया है।)

मेरा प्रश्न है: क्या किसी के ऊपर 'br' टैग से मिलान करने के एक अभिव्यक्ति है कि सभी वर्तमान ब्राउज़रों में काम करता है पता है (लेकिन अन्य नहीं HTML टैग) । और क्या कोई पुष्टि कर सकता है कि उपरोक्त अंतिम उदाहरण वैध मिलान होना चाहिए क्योंकि '>' से पहले उदाहरण टेक्स्ट में दो वर्ण मौजूद हैं।

पीएस - मेरा डॉक्टरेट एचटीएमएल संक्रमणकालीन है।

संपादित करें:

मुझे लगता है कि मैं सबूत हैं इस string.split() IE पर व्यवहार के लिए विशिष्ट है, और सामान्य रूप में regex नहीं। इस समस्या को देखने के लिए आपको split() का उपयोग करना होगा। मुझे एक परीक्षण मैट्रिक्स भी मिला है जो आईई पर चलाए जाने पर विभाजन() परीक्षण मामलों के लिए लगभग 30% की विफलता दर दिखाता है। एक ही परीक्षण पर एफएफ और क्रोम 100% पारित कर दिया:

http://stevenlevithan.com/demo/split.cfm

अब तक, मैं अभी भी नहीं IE के लिए एक समाधान है, और है कि परीक्षण मैट्रिक्स इस मामले का समाधान नहीं होता के लेखक द्वारा प्रदान की पुस्तकालय मिल गया है।

+0

पीपीएस - मैं वर्तमान परीक्षण आईई 6 या ओपेरा नहीं हूं, लेकिन यह प्रासंगिक होने पर इन पर चर्चा करने में संकोच न करें। –

उत्तर

15

कारण अपने कोड काम नहीं कर रहा है क्योंकि आईई HTML को पार्स और टैग अपरकेस जब बनाता है आप इसे आंतरिक HTML के माध्यम से पढ़ते हैं। उदाहरण के लिए, अगर आप इस तरह HTML है:

alert(document.getElementById('box').innerHTML); 

आप इस के साथ एक बॉक्स मिल जाएगा:

Hello<BR>World 

<div id='box'> 
Hello<br> 
World 
</div> 

और फिर आप इस जावास्क्रिप्ट (आईई में) का उपयोग

<BR> पर ध्यान दें अब अपरकेस है। इसे ठीक करने के लिए, g ध्वज के अलावा ध्वज को रेगेक्स केस-असंवेदनशील बनाने के लिए जोड़ें और यह आपकी अपेक्षा के अनुसार काम करेगा।

+0

हाँ, आप बिल्कुल सही हैं। एक लाख धन्यवाद, और अब मैं आईई पर आंतरिक HTML के बारे में कुछ नया जानता हूं। –

6

इस एक का प्रयास करें:

/<br[^>]*>/gi 
+1

मैं सलाह दूंगा क्योंकि आप कभी नहीं जानते कि कोई व्यक्ति उनके टैग –

+0

कैसे करेगा, यह क्रोम और एफएफ में काम करता है, और आईई में विफल रहता है। मैं +1 दे रहा हूं क्योंकि इसे * काम करना चाहिए। –

+0

बीटीडब्ल्यू, जैसा कि अब मुझे एहसास है कि यह ठीक नहीं होता है जब आपने यहां प्रदान किया था। मैंने 'i' ध्वज छोड़ा क्योंकि मैं ज्ञात लो-केस स्रोत के साथ काम कर रहा था। सबक सीखा: आंतरिक HTML में आईई अप-केस टैग। –

0

regexes एचटीएमएल पार्स करने (क्यों के लिए Can you provide some examples of why it is hard to parse XML and HTML with a regex? देखें) में मौलिक रूप से खराब हैं। आपको एक HTML पार्सर की आवश्यकता है। विभिन्न प्रकार के पार्सर्स का उपयोग करके उदाहरणों के लिए Can you provide an example of parsing HTML with your favorite parser? देखें।

विशेष रूप से आपको JavaScript+DOM answer में रुचि हो सकती है।

+2

हाँ, मैं एक पूर्ण HTML पार्सर करने का इरादा नहीं रख रहा हूं, और यह एक jQuery वातावरण नहीं है। कृपया ध्यान दें, रेगेक्स को संभालने में कोई समस्या नहीं है, लेकिन आईई 7 और 8 में ब्राउज़र कंपैट समस्या है। हालांकि एफएफ में विफल होने वाला उदाहरण मुझे भी पहेली करता है।) –

+1

"रेगेक्स मूल रूप से HTML को पार्स करने में खराब हैं" - नहीं यदि आप जानते हैं कि इनपुट कैसा दिख रहा है। – nickf

+0

@ वाल्ट गॉर्डन जोन्स यह कोई फर्क नहीं पड़ता कि आप क्या करना चाहते हैं या नहीं, रेगेक्स एचटीएमएल को संभाल नहीं सकते हैं, यह नहीं है कि वे अच्छे हैं, कम से कम एक पार्सर के साथ ऐसा करने के लिए एक नज़र डालें, आप हमेशा डीओएम का उपयोग कर सकते हैं। –

1

/<br.*?>/ 

के बजाय आप की कोशिश कर सकते

/<br[^>]*>/ 

अर्थात मिलान "<br", '>' के बाद '>' अलावा अन्य किसी भी वर्ण, के बाद।

+0

धन्यवाद, अभी भी केवल आईई में विफल रहता है। –

0

ठीक है, दुर्भाग्य से मैं काम (सिर्फ आईई - उच्छ्वास) में ब्राउज़रों की एक विस्तृत विविधता नहीं है, लेकिन सही बल्ले से दूर मैं देख सकता हूँ अपने रेगुलर एक्सप्रेशन से अनुकूलन करने के लिए एक तरह से:

T = captions.innerHTML.split(/<br[^>]*?>/g); 

इनलाइन चरित्र वर्ग परिभाषा [^>] किसी भी चरित्र से मिलान करने के लिए अभिव्यक्ति को निर्देश से अधिक से अधिक संकेत देती है। आप इसे केस असंवेदनशील बनाना भी चाहते हैं (अंत में जी को पास न करें जी)।

+0

कुछ नियमित अभिव्यक्ति इंजनों में, *? ऑपरेटर गैर-लालची मिलान को इंगित करता है, जहां/.*?>/ किसी भी चरित्र को * पहले * बिंदु तक मिलान करेगा जहां निम्न पाठ मेल खाता है। बिना?,/.*>/ * अंतिम * बिंदु तक मेल खाता है जहां निम्न पाठ मेल खाता है। –

+0

हां, पहला मैच (स्पष्ट रूप से) चाहते हैं, लेकिन [^>] पहले मैच को मजबूर करने के लिए एक चालाक तरीका की तरह दिखता है क्योंकि इस शर्त को पूरा करने का यही एकमात्र तरीका है। भले ही, लालच होने वाली भिन्नताएं भी आईई के तहत मेल नहीं खाती हैं। –

0

फ़ायरफ़ॉक्स 3 & IE7 में परीक्षण किया गया:

/<br.*?>/gi 

यह अपने आप को यहाँ का प्रयास करें: http://jsbin.com/ofoke

var input = "one <br/>\n" 
      + "two <br />\n" 
      + "three <br>\n" 
; 

alert(input.replace(/<br.*?>/gi, '')); 
+0

मेरा मानना ​​है कि मैंने यह निर्धारित किया है कि समस्या विशेष रूप से आईई पर String.split के साथ है। (आपका उदाहरण स्ट्रिंग प्रतिस्थापन का उपयोग करता है।) विभाजन के लिए इस टेस्ट केस मैट्रिक्स को देखें(): http://stevenlevithan.com/demo/split.cfm IE मामलों में लगभग 30% विफल रहता है। एफएफ और क्रोम इस मैट्रिक्स 100% पास करते हैं। –

+0

क्या आप
टैग को "|| BR ||" से प्रतिस्थापित करने के लिए, रेगेक्स का उपयोग करके प्रतिस्थापन की तरह कुछ करने का प्रयास कर सकते हैं। और फिर इसे विभाजित करने के लिए एक सामान्य गैर-रेगेक्स का उपयोग करें? input.replace (/ /जीआई, '|| बीआर ||')। विभाजन ("|| बीआर ||"); क्या यह काम करता है? – nickf

0

< \ रों br \ रों /? \ S *>

मैचों

<br>, <br />, <br>,<br/> 

मैं IE.6 में here का परीक्षण किया। यदि मार्च ठीक है, तो जेएस निश्चित रूप से regexp के अनुसार इसे विभाजित कर सकता है।

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