2 टैग्स के बीच के सभी टेक्स्ट को चुनने का सबसे अच्छा तरीका क्या है - पूर्व: पेज पर सभी 'पूर्व' टैग के बीच का टेक्स्ट।
/<div>.*?<\/div>/.exec("<div><div></div></div>")
2 टैग्स के बीच के सभी टेक्स्ट को चुनने का सबसे अच्छा तरीका क्या है - पूर्व: पेज पर सभी 'पूर्व' टैग के बीच का टेक्स्ट।
/<div>.*?<\/div>/.exec("<div><div></div></div>")
जवाबों:
आप उपयोग कर सकते हैं "<pre>(.*?)</pre>"
, (जो भी पाठ आप चाहते हैं उसके साथ पूर्व की जगह) और पहले समूह को निकालें (अधिक विशिष्ट निर्देशों के लिए एक भाषा निर्दिष्ट करें) लेकिन यह उस सरल धारणा को मानता है जो आपके पास बहुत ही सरल और मान्य HTML है।
जैसा कि अन्य टिप्पणीकारों ने सुझाव दिया है, यदि आप कुछ जटिल कर रहे हैं, तो एक HTML पार्सर का उपयोग करें।
<pre>
टैग को आज़माने के बाद देख रहे हैं <pre>(.*?)<\/pre>
, तो ऐसा इसलिए है क्योंकि आप देख रहे हैं कि एक (। *?) कैप्चर समूह के बजाय पूर्ण मिलान द्वारा क्या कैप्चर किया गया है। चीयर्स लगता है लेकिन मुझे हमेशा लगता है कि "कोष्ठक = चोरों की जोड़ी" क्योंकि जब तक कि इसमें (
एक के ?
रूप में पालन नहीं किया जाता है (?:
या (?>
, प्रत्येक मैच में दो कैप्चर होंगे: पूर्ण मैच के लिए 1 और कैप्चर समूह के लिए 1। कोष्ठक का प्रत्येक अतिरिक्त सेट एक अतिरिक्त कब्जा जोड़ता है। आपको बस यह जानना है कि आप जिस भी भाषा में काम कर रहे हैं, उसमें दोनों कैप्चर को कैसे पुनः प्राप्त करें।
टैग को दूसरी पंक्ति में पूरा किया जा सकता है। इस कारण \n
इसे जोड़ने की जरूरत है।
<PRE>(.|\n)*?<\/PRE>
(.|\n)*?
कई पंक्तियों में HTML टैग के साथ काम करते समय जोड़ने के बारे में महत्वपूर्ण बिंदु । चयनित उत्तर केवल तभी काम करता है जब HTML टैग उसी लाइन पर हों।
(.|\n)*?
भी किसी चार का मिलान करने के लिए उपयोग न करें । हमेशा (सिंगललाइन) संशोधक के .
साथ उपयोग करें s
। या एक [\s\S]*?
वर्कअराउंड।
/\*(.|\n)*?\*/
जिसके साथ काम किया - धन्यवाद
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
मूल रूप से यह क्या करता है:
(?<=(<pre>))
चयन को <pre>
टैग के साथ प्रस्तुत करना होगा
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
यह सिर्फ एक नियमित अभिव्यक्ति है जिसे मैं लागू करना चाहता हूं। इस मामले में, यह अक्षर या अंक या न्यूलाइन वर्ण या उदाहरण के वर्ग कोष्ठक में सूचीबद्ध कुछ विशेष वर्णों का चयन करता है। पाइप पात्र |
का सीधा सा मतलब है " या "।
+?
प्लस वर्ण ऊपर या एक से अधिक का चयन करने के लिए कहता है - आदेश कोई फर्क नहीं पड़ता। प्रश्न चिह्न 'लालची' से 'अस्वाभाविक' होने के डिफ़ॉल्ट व्यवहार को बदल देता है।
(?=(</pre>))
चयन को </pre>
टैग द्वारा जोड़ा जाना है
आपके उपयोग के मामले के आधार पर आपको कुछ संशोधन करने की आवश्यकता हो सकती है जैसे ( i या m )
यहाँ मैंने इस खोज को Sublime Text में किया ताकि मुझे अपने regex में संशोधक का उपयोग न करना पड़े।
उपरोक्त उदाहरण को PHP, पर्ल, जावा ... जावास्क्रिप्ट जैसी भाषाओं के साथ ठीक काम करना चाहिए, हालांकि, खोजबीन का समर्थन नहीं करता है इसलिए हमें उपयोग करने के बारे में भूल जाना (?<=(<pre>))
चाहिए और किसी प्रकार के वर्कअराउंड की तलाश करनी चाहिए। शायद प्रत्येक चयन के लिए हमारे परिणाम से पहले चार वर्णों को पट्टी करें जैसे
टैग्स के बीच रेगेक्स मैच टेक्स्ट
गैर कैप्चरिंग कोष्ठक के लिए JAVASCRIPT REGEX DOCUMENTATION को भी देखें
तत्व के बीच सामग्री प्राप्त करने के लिए नीचे दिए गए पैटर्न का उपयोग करें। [tag]
उस वास्तविक तत्व से बदलें जिसे आप सामग्री से निकालना चाहते हैं।
<[tag]>(.+?)</[tag]>
कुछ समय टैग में विशेषताएँ होंगी, जैसे anchor
टैग होना href
, फिर नीचे पैटर्न का उपयोग करें।
<[tag][^>]*>(.+?)</[tag]>
<[tag]>
मैच होगा <t>
, <a>
और<g>
Replace [tag] with the actual element you wish to extract the content from
भाग से चूक गए ।
[]
पूरी तरह से छोड़ दिया जाना चाहिए था। यह अधिक स्पष्ट होगा, क्योंकि RegEx और इस तथ्य में उनके अर्थ के कारण, कि लोग पहले कोड को स्कैन करते हैं और पाठ को पढ़ते हैं;)
परिसीमन टैग को बाहर करने के लिए:
(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
पाठ के बाद दिखता है <pre>
(?=</pre>)
पहले पाठ के लिए लग रहा है </pre>
परिणाम pre
टैग के अंदर पाठ करेंगे
आपको html को पार्स करने की कोशिश नहीं करनी चाहिए, क्योंकि रेगेक्स इस प्रश्न को देखते हैं और यह कैसे निकला।
सरल शब्दों में, html एक नियमित भाषा नहीं है, इसलिए आप पूरी तरह से पार्स नहीं कर सकते नियमित अभिव्यक्ति के साथ है।
जब आपने कहा कि आप HTML के सबसेट को पार्स कर सकते हैं जब कोई समान टैग न हों। तो जब तक उस टैग के बीच कुछ भी नहीं है, तब तक यह काम करेगा:
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
एक बेहतर विचार यह है कि आप अपने html को लोड करने के लिए मूल DOMDocument की तरह एक पार्सर का उपयोग करें, फिर अपने टैग का चयन करें और इनर html प्राप्त करें जो कुछ इस तरह दिख सकता है:
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
और चूंकि यह एक उचित पार्सर है इसलिए यह घोंसले के शिकार टैग आदि को संभालने में सक्षम होगा।
php
। सुनिश्चित नहीं है कि पिक्चर में PHP कैसे आया ...
इसे इस्तेमाल करे....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
यह उत्तर चारों ओर देखने के लिए समर्थन को दबा देता है! इससे मुझे टैग खोलने और बंद करने के जोड़े के बीच के सभी पाठों की पहचान करने की अनुमति मिली। वह सब '>' और '<' के बीच का पाठ है। यह काम करता है क्योंकि चारों ओर देखो यह मेल खाता पात्रों का उपभोग नहीं करता है।
(? <=>) ([\ W \ रों]) (? = </)
मैंने इस HTML टुकड़े का उपयोग करके इसे https://regex101.com/ में परीक्षण किया ।
<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>
यह तीन भागों का खेल है: पीछे की ओर देखो, सामग्री और आगे देखो।
(?<=>) # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/) # look ahead (but don't consume/capture) for a '</'
मुझे उम्मीद है कि 10. के लिए एक शुरुआत के रूप में कार्य करता है।
var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });
चूंकि स्वीकृत उत्तर जावास्क्रिप्ट कोड के बिना है, इसलिए इसे जोड़ना:
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
यह regex टैगिंग के बीच प्रत्येक चयन करेगा। कोई बात नहीं यह नई लाइन (बहुस्तरीय के साथ काम) में है।
पायथन में, DOTALL
ध्वज स्थापित करने से नई चीज़ों सहित सब कुछ कैप्चर हो जाएगा।
यदि DOTALL ध्वज निर्दिष्ट किया गया है, तो यह किसी भी वर्ण सहित मेल खाता है। docs.python.org
#example.py using Python 3.7.4
import re
str="""Everything is awesome! <pre>Hello,
World!
</pre>
"""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)
print(matches.group(1))
python example.py
Hello,
World!
किसी दस्तावेज़ में सभी उद्घाटन और समापन टैग के बीच पाठ को पकड़ने के लिए, finditer
उपयोगी है। नीचे दिए गए उदाहरण में, तीन उद्घाटन और समापन <pre>
टैग स्ट्रिंग में मौजूद हैं।
#example2.py using Python 3.7.4
import re
# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)
matches = pattern.finditer(str)
for i,match in enumerate(matches):
print(f"tag {i}: ",match.group(1))
python example2.py
tag 0: Desert Survival Problem
tag 1: humor conditions
tag 2: endless opportunity for self-reflection
आप उपयोग कर सकते हैं Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>