रेगेक्स टैग के बीच सभी पाठ का चयन करें


143

2 टैग्स के बीच के सभी टेक्स्ट को चुनने का सबसे अच्छा तरीका क्या है - पूर्व: पेज पर सभी 'पूर्व' टैग के बीच का टेक्स्ट।


2
सबसे अच्छा तरीका है "सुंदर सूप" जैसे एक html-parser का उपयोग करें यदि आप अजगर में हैं ...
फ्रेड्रिक पिहल

1
सबसे अच्छा तरीका XML / HTML पार्सर का उपयोग करना है।
डैनियल ओ'हारा

4
सामान्य तौर पर, html को पार्स करने के लिए नियमित अभिव्यक्ति का उपयोग करना अच्छा विचार नहीं है: stackoverflow.com/questions/1732348/…
murgatroid99

रेगेक्स वाले टैग के बीच पाठ को पार्स न करें क्योंकि मनमाने ढंग से नेस्टेड टैग HTML को गैर-नियमित बनाते हैं। मिलान टैग ठीक लग रहे हैं। /<div>.*?<\/div>/.exec("<div><div></div></div>")
jdh8

जवाबों:


157

आप उपयोग कर सकते हैं "<pre>(.*?)</pre>", (जो भी पाठ आप चाहते हैं उसके साथ पूर्व की जगह) और पहले समूह को निकालें (अधिक विशिष्ट निर्देशों के लिए एक भाषा निर्दिष्ट करें) लेकिन यह उस सरल धारणा को मानता है जो आपके पास बहुत ही सरल और मान्य HTML है।

जैसा कि अन्य टिप्पणीकारों ने सुझाव दिया है, यदि आप कुछ जटिल कर रहे हैं, तो एक HTML पार्सर का उपयोग करें।


41
यह टैग के बीच पाठ का चयन नहीं करता है , इसमें टैग शामिल हैं।
कैपिकॉ


2
मल्टी लाइन टैग के लिए: <html_tag> (। +) (((S) + (। +)) + <\ / Html_tag>
Felipe Augusto

इसमें अभी भी दृश्यता इतनी है: यदि आप अभी भी <pre>टैग को आज़माने के बाद देख रहे हैं <pre>(.*?)<\/pre>, तो ऐसा इसलिए है क्योंकि आप देख रहे हैं कि एक (। *?) कैप्चर समूह के बजाय पूर्ण मिलान द्वारा क्या कैप्चर किया गया है। चीयर्स लगता है लेकिन मुझे हमेशा लगता है कि "कोष्ठक = चोरों की जोड़ी" क्योंकि जब तक कि इसमें (एक के ?रूप में पालन ​​नहीं किया जाता है (?:या (?>, प्रत्येक मैच में दो कैप्चर होंगे: पूर्ण मैच के लिए 1 और कैप्चर समूह के लिए 1। कोष्ठक का प्रत्येक अतिरिक्त सेट एक अतिरिक्त कब्जा जोड़ता है। आपको बस यह जानना है कि आप जिस भी भाषा में काम कर रहे हैं, उसमें दोनों कैप्चर को कैसे पुनः प्राप्त करें।
rbsdca

137

टैग को दूसरी पंक्ति में पूरा किया जा सकता है। इस कारण \nइसे जोड़ने की जरूरत है।

<PRE>(.|\n)*?<\/PRE>

5
(.|\n)*?कई पंक्तियों में HTML टैग के साथ काम करते समय जोड़ने के बारे में महत्वपूर्ण बिंदु । चयनित उत्तर केवल तभी काम करता है जब HTML टैग उसी लाइन पर हों।
कालेनहोपकिंस

3
विंडोज लाइन के अंत के लिए <PRE> ((। | \ N। \ R \ n) *? </ PRE>
मार्क

3
कभी (.|\n)*?भी किसी चार का मिलान करने के लिए उपयोग न करें । हमेशा (सिंगललाइन) संशोधक के .साथ उपयोग करें s। या एक [\s\S]*?वर्कअराउंड।
विकिटोर स्ट्रिबिएव

मैं नोटपैड ++ में कोड टिप्पणियों का चयन करना चाहता था, इसलिए इस उत्तर का उपयोग करते हुए मैं आया /\*(.|\n)*?\*/जिसके साथ काम किया - धन्यवाद
wkille

सही जवाब बहुत बहुत धन्यवाद
ओमदा

25

यह वही है जो मैं उपयोग करूंगा।

(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))

मूल रूप से यह क्या करता है:

(?<=(<pre>))चयन को <pre>टैग के साथ प्रस्तुत करना होगा

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )यह सिर्फ एक नियमित अभिव्यक्ति है जिसे मैं लागू करना चाहता हूं। इस मामले में, यह अक्षर या अंक या न्यूलाइन वर्ण या उदाहरण के वर्ग कोष्ठक में सूचीबद्ध कुछ विशेष वर्णों का चयन करता है। पाइप पात्र |का सीधा सा मतलब है " या "।

+?प्लस वर्ण ऊपर या एक से अधिक का चयन करने के लिए कहता है - आदेश कोई फर्क नहीं पड़ता। प्रश्न चिह्न 'लालची' से 'अस्वाभाविक' होने के डिफ़ॉल्ट व्यवहार को बदल देता है।

(?=(</pre>))चयन को </pre>टैग द्वारा जोड़ा जाना है

यहां छवि विवरण दर्ज करें

आपके उपयोग के मामले के आधार पर आपको कुछ संशोधन करने की आवश्यकता हो सकती है जैसे ( i या m )

  • i - केस-असंवेदनशील
  • m - बहु-पंक्ति खोज

यहाँ मैंने इस खोज को Sublime Text में किया ताकि मुझे अपने regex में संशोधक का उपयोग न करना पड़े।

जावास्क्रिप्ट लुकअप का समर्थन नहीं करता है

उपरोक्त उदाहरण को PHP, पर्ल, जावा ... जावास्क्रिप्ट जैसी भाषाओं के साथ ठीक काम करना चाहिए, हालांकि, खोजबीन का समर्थन नहीं करता है इसलिए हमें उपयोग करने के बारे में भूल जाना (?<=(<pre>))चाहिए और किसी प्रकार के वर्कअराउंड की तलाश करनी चाहिए। शायद प्रत्येक चयन के लिए हमारे परिणाम से पहले चार वर्णों को पट्टी करें जैसे टैग्स के बीच रेगेक्स मैच टेक्स्ट

गैर कैप्चरिंग कोष्ठक के लिए JAVASCRIPT REGEX DOCUMENTATION को भी देखें


ध्यान दें कि regexp को एक स्ट्रिंग में रखने के लिए आपको `के साथ एकल / दोहरे उद्धरण वर्णों से बचने की आवश्यकता है।
डेविड ज्वार्ट

18

तत्व के बीच सामग्री प्राप्त करने के लिए नीचे दिए गए पैटर्न का उपयोग करें। [tag]उस वास्तविक तत्व से बदलें जिसे आप सामग्री से निकालना चाहते हैं।

<[tag]>(.+?)</[tag]>

कुछ समय टैग में विशेषताएँ होंगी, जैसे anchorटैग होना href, फिर नीचे पैटर्न का उपयोग करें।

 <[tag][^>]*>(.+?)</[tag]>

पहले उदाहरण को '<head> (। +?) </ Head>' के रूप में आज़माएँ और अपेक्षा के अनुरूप काम करता है। लेकिन मेरे पास दूसरे के साथ कोई परिणाम नहीं है।
एलेक्स बर्थ

1
यह काम नहीं करता है। <[tag]>मैच होगा <t>, <a>और<g>
मार्टिन श्नाइडर

2
@ एमए-मैडिन - मुझे लगता है कि आप Replace [tag] with the actual element you wish to extract the content fromभाग से चूक गए ।
LWC

2
ओह ठीक है, हाँ। इन्हें []पूरी तरह से छोड़ दिया जाना चाहिए था। यह अधिक स्पष्ट होगा, क्योंकि RegEx और इस तथ्य में उनके अर्थ के कारण, कि लोग पहले कोड को स्कैन करते हैं और पाठ को पढ़ते हैं;)
मार्टिन श्नाइडर

14

परिसीमन टैग को बाहर करने के लिए:

(?<=<pre>)(.*?)(?=</pre>)

(?<=<pre>) पाठ के बाद दिखता है <pre>

(?=</pre>) पहले पाठ के लिए लग रहा है </pre>

परिणाम preटैग के अंदर पाठ करेंगे


इस का उपयोग करने वाले लोग @krishna thakor के उत्तर को देखते हैं जो इस बात पर भी विचार कर सकते हैं कि क्या सामग्री टैग के बीच नई रेखा है
KingKongCoder

इससे मेरे मामले में मदद मिली (नई कहानियों पर विचार करने की आवश्यकता नहीं)। धन्यवाद।
Pking

6

आपको 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();

और चूंकि यह एक उचित पार्सर है इसलिए यह घोंसले के शिकार टैग आदि को संभालने में सक्षम होगा।


2
बस यह कहना चाहता हूं कि मैं थोड़ा परेशान हूं कि यह अभी भी डाउनवोट्स इकट्ठा कर रहा है, जबकि यह एकमात्र उत्तर है जो रेगेक्स एक के बगल में एक उचित समाधान की आपूर्ति करता है और मैंने पर्याप्त चेतावनी भी जोड़ी है कि यह शायद सही तरीका नहीं है ... कम से कम मेरे उत्तर के बारे में क्या गलत है, कृपया टिप्पणी करें।
sg3s

1
सवाल को टैग नहीं किया गया था php। सुनिश्चित नहीं है कि पिक्चर में PHP कैसे आया ...
trincot

@trincot यह 7 साल पहले की तुलना में अधिक था, इसलिए मुझे याद नहीं आ रहा है। किसी भी मामले में यह एक रेगेक्स और एक पार्सर के साथ समस्या को हल करने का एक उदाहरण है। रेगेक्स अच्छा है और php सिर्फ वही है जो मैं उस समय अच्छी तरह से जानता था।
sg3s

मैं समझता हूं, मैंने आपकी पहली टिप्पणी देखी और सोचा कि इससे कुछ गिरावट आ सकती है।
ट्रिनकोट

5

इसे इस्तेमाल करे....

(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)

3
ध्यान दें कि पीछे देखने पर जावास्क्रिप्ट में समर्थित नहीं है।
18

Ooo बेशक, लेकिन यह रेगेक्स जावा के लिए है। आपके नोट के लिए धन्यवाद।
हेरिबेटो रिवेरा

4

यह मुझे मिली सभी की सबसे सरल नियमित अभिव्यक्ति लगती है

(?:<TAG>)([\s\S]*)(?:<\/TAG>)
  1. (?:<TAG>)मैचों से शुरुआती टैग को बाहर निकालें
  2. ([\s\S]*)मैचों में किसी भी व्हाट्सएप या गैर-व्हाट्सएप पात्रों को शामिल करें
  3. (?:<\/TAG>)मैचों से समापन टैग को छोड़ दें

3

यह उत्तर चारों ओर देखने के लिए समर्थन को दबा देता है! इससे मुझे टैग खोलने और बंद करने के जोड़े के बीच के सभी पाठों की पहचान करने की अनुमति मिली। वह सब '>' और '<' के बीच का पाठ है। यह काम करता है क्योंकि चारों ओर देखो यह मेल खाता पात्रों का उपभोग नहीं करता है।

(? <=>) ([\ 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 '</'

regex101.com से स्क्रीन कैप्चर

मुझे उम्मीद है कि 10. के लिए एक शुरुआत के रूप में कार्य करता है।


धन्यवाद। न केवल यह एक बेहतर उत्तर है, बल्कि regex101 साइट का एक शानदार लिंक भी है। Upvoted! F
सीन फेल्डमैन

2

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); });

चूंकि स्वीकृत उत्तर जावास्क्रिप्ट कोड के बिना है, इसलिए इसे जोड़ना:


1

preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)यह regex टैगिंग के बीच प्रत्येक चयन करेगा। कोई बात नहीं यह नई लाइन (बहुस्तरीय के साथ काम) में है।


1

पायथन में, 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



0

मैं इस समाधान का उपयोग करता हूं:

preg_match_all( '/<((?!<)(.|\n))*?\>/si',  $content, $new);
var_dump($new);

-1

जावास्क्रिप्ट में (दूसरों के बीच), यह सरल है। इसमें विशेषताएँ और कई लाइनें शामिल हैं:

/<pre[^>]*>([\s\S]*?)<\/pre>/

-4
<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>

6
कृपया शब्दों का उपयोग करके अपने उत्तर का परिचय / व्याख्या करें।
एंड्रयू रेगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.