2012-09-19 7 views
7

के बीच है मैं निम्नलिखित स्ट्रिंग है:Regex टेक्स्ट को बदल दें लेकिन को बाहर जब पाठ विशिष्ट टैग

Lorem ipsum Test dolor sit amet, consetetur sadipscing elitr, sed diam nonumy <a href="http://Test.com/url">Test</a> eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd sed Test dolores et ea rebum. Stet clita kasd gubergren, no sea <a href="http://url.com">Test xyz</a> takimata sanctus est Lorem ipsum dolor sit amet. 

अब मैं स्ट्रिंग टैग टैग के बीच एक नहीं (जैसे '1234' के साथ बदल के 'टेस्ट' के बाहर की जगह लेंगे)। (?!<a[^>]*>)(Test)([^<])(?!</a>)

लेकिन दो समस्याओं को हल नहीं कर रहे हैं:

  1. पाठ 'टेस्ट' भी अंदर टैग प्रतिस्थापित हो जाता है (उदाहरण के लिए)
  2. पाठ करता है

    Lorem ipsum 1234 dolor sit amet, consetetur sadipscing elitr, sed diam nonumy <a href="http://Test.com/url">Test</a> eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd sed 1234 dolores et ea rebum. Stet clita kasd gubergren, no sea <a href="http://url.com">Test xyz</a> takimata sanctus est Lorem ipsum dolor sit amet. 
    

    मैं इस regex के साथ शुरू टैग के बीच बिल्कुल खोजे गए पाठ से मेल नहीं खाता है, इसे भी बदला जाएगा (उदाहरण के लिए <a href="http://url">Test xyz</a>)

मुझे आशा है कि किसी को इस समस्या को हल करने का समाधान होगा।

उत्तर

9
(?!<a[^>]*?>)(Test)(?![^<]*?</a>) 

ही प्रयास करें, लेकिन

इसके अलावा एक आलसी मैच के साथ अनुकूलित किया है, regexes के प्रयोग पर कच्चे HTML है सिफारिश नहीं की गई।

+0

मैं भी \ b झंडा एक शब्द सीमा मैच के लिए कहा: (?!? ] *>) (\ bTest \ ख) (?! [^ <]*?) – Weri

+0

जो रेगेक्स अनुकूलक को काम करने के लिए और अधिक देना चाहिए। यह आपके मैचों में प्रतिकूल रूप से प्रभावित नहीं होना चाहिए, जब तक कि आपके दस्तावेज़ में '_Test_, _Test, या Test_' नहीं हैं (और मानते हैं कि यदि आप थे तो आप उन्हें मिलान करने की परवाह नहीं करेंगे)। – protist

+0

टेस्ट और आलसी मैच से पहले देखा गया अर्थहीन है। मेरा जवाब देखें मेरे लिए – Adam

3

इस चाल करना चाहिए:

(?!<a[^>]*>)(Test)(?![^<]*</a>) 

यह अपने आप zb226 रूप on regexr.

2

इस प्राचीन प्रश्न का पुनरुत्थान क्योंकि इसका एक सरल समाधान था जिसका उल्लेख नहीं किया गया था।

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

के लिए पर्ल/PCRE

<a[^>]*>[^<]*<\/a(*SKIP)(*F)|Test 

demo

जनरल समाधान

<a[^>]*>[^<]*<\/a|(Test) 

इस संस्करण में विधि, पाठ प्रतिस्थापित किया जाना समूह 1 और में कब्जा कर लिया है प्रतिस्थापन एक साधारण कॉलबैक या लैम्ब्डा द्वारा किया जाता है।

demo

संदर्भ

  1. How to match pattern except in situations s1, s2, s3
  2. कोड कार्यान्वयन के लिए How to match a pattern unless...
+0

सबसे महत्वपूर्ण हिस्सा पता करने के लिए था '$ प्रतिस्थापित = preg_replace_callback ( \t $ regex, \t समारोह ($ एम) {if (खाली ($ मी [1])) वापसी $ मी [0]; \t \t \t \t \t अन्य "सुपरमैन";}, \t $ विषय) लौटाएं; '। तो मुझे 'एम [0]' वापस करने की जरूरत है यदि 'एम [1]' खाली है। जानना वास्तव में अच्छा है। धन्यवाद! – mgutt

4

में कोड नमूने देखने यह मैच से पहले एक अग्रदर्शी डाल करने के लिए अर्थहीन है।तो निम्नलिखित protist जवाब के बराबर है:

(Test)(?![^<]*?</a>) 
भी < के बाद से

अनुमति नहीं है आलसी मैच ? ज़रूरत से ज़्यादा है, इसलिए इसकी

(Test)(?![^<]*</a>) 

को भी बराबर यह सब Test कि द्वारा पीछा नहीं कर रहे हैं का चयन करता है के बीच < के बीच में </a>। यही कारण है कि किसी भी <a ...> .. </a> से पहले या बाद में परीक्षण किया जाएगा।

हालांकि, ध्यान दें कि

Lorem Test dolor <a href="http://Test.com/url">Test <strong>dolor</strong></a> eirmod 

को पकड़ने के लिए आप

(Test)(?!(.(?!<a))*?</a>) 

करने के लिए अपने regex बदल सकता है जो निम्नलिखित करता

Lorem 1234 dolor <a href="http://1234.com/url">1234 <strong>dolor</strong></a> eirmod 

से बदल दिया जाएगा आदेश में:

प्रत्येक शब्द Test का चयन करें जो स्ट्रिंग ***</a> के बाद नहीं है, जहां *** में प्रत्येक वर्ण <a के बाद नहीं है।

ध्यान दें कि यहां आलसी मैच ? समझ में आता है।

protist

कहा इसके अलावा, का उपयोग करते हुए कच्चे एचटीएमएल पर regexes अनुशंसित नहीं है।

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

Lorem Test dolor Test <strong>dolor</strong></a> eirmod 

को
Lorem Test dolor Test <strong>dolor</strong></a> eirmod 1234 dolores sea 1234 takimata 
संबंधित मुद्दे