রেজেজেক্স ট্যাগের মধ্যে সমস্ত পাঠ্য নির্বাচন করুন


143

2 টি ট্যাগের মধ্যে সমস্ত পাঠ্য বাছাই করার সর্বোত্তম উপায় কী - উদাহরণস্বরূপ: পৃষ্ঠায় থাকা সমস্ত 'প্রাক' ট্যাগের মধ্যে পাঠ্য।


2
সেরা উপায় হ'ল আপনি যদি অজগরের মধ্যে পড়ে থাকেন তবে "বিউটিফুল স্যুপ" এর মতো এইচটিএমএল-পার্সার ব্যবহার করুন ...
ফ্রেড্রিক পাইহল

1
এক্সএমএল / এইচটিএমএল পার্সার ব্যবহার করার সর্বোত্তম উপায়।
ড্যানিয়েল ও'হারা

4
সাধারণভাবে, পার্স HTML এ রেগুলার এক্সপ্রেশান্স ব্যবহার করে একটি ভাল ধারণা নয়: stackoverflow.com/questions/1732348/...
murgatroid99

রেজেক্সের সাথে ট্যাগগুলির মধ্যে পাঠকে পার্স করবেন না কারণ নির্বিচারে নেস্ট করা ট্যাগগুলি এইচটিএমএলকে নিয়মিত করে না। ম্যাচিং ট্যাগগুলি ঠিক আছে বলে মনে হচ্ছে। /<div>.*?<\/div>/.exec("<div><div></div></div>")
jd8

উত্তর:


157

আপনি ব্যবহার করতে পারেন "<pre>(.*?)</pre>"(যা কিছু পাঠ্য চান তার সাথে পূর্বের পরিবর্তে) এবং প্রথম গোষ্ঠীটি বের করুন (আরও নির্দিষ্ট নির্দেশাবলীর জন্য একটি ভাষা নির্দিষ্ট করুন) তবে এটি আপনার সহজ এবং বৈধ এইচটিএমএল রয়েছে এমন সরল ধারণাটি ধরে নিয়েছে।

অন্যান্য মন্তব্যকারীরা যেমন পরামর্শ দিয়েছেন, আপনি যদি কিছু জটিল করছেন তবে একটি HTML পার্সার ব্যবহার করুন।


41
এটি ট্যাগগুলির মধ্যে পাঠ্য নির্বাচন করে না , এতে ট্যাগগুলি অন্তর্ভুক্ত রয়েছে।
ক্যাপিকা ওয়া

3
আপনার () ব্যবহার করে নির্বাচন দখল করতে হবে
সাহু ভি কুমার

2
মাল্টি লাইন ট্যাগের জন্য: <html_tag> (। +) ((\ গুলি) + (। +)) + <\ / এইচটিএমএল_ট্যাগ>
ফিলিপ অগাস্টো

এটির এখনও দৃশ্যমানতা রয়েছে: <pre>চেষ্টা করার পরেও যদি আপনি ট্যাগগুলি দেখেন তবে <pre>(.*?)<\/pre>এটি (because *?) ক্যাপচার গোষ্ঠীর পরিবর্তে পুরো ম্যাচটি কী কী ক্যাপচার করেছে তা আপনি দেখতে পাচ্ছেন। উদাসীন মনে হলেও আমি সর্বদা "বন্ধনী = চোরের জুড়ি" মনে করি কারণ যতক্ষণ না এই (হিসাবে অনুসরণ ?করা হয় (?:বা না হয় (?>, প্রতিটি ম্যাচে দুটি ক্যাপচার থাকবে: পুরো ম্যাচের জন্য 1 এবং ক্যাপচার গ্রুপের জন্য 1। প্রতিটি প্রথম বন্ধনীর সেট অতিরিক্ত ক্যাপচার যুক্ত করে। আপনি যে ভাষাতে কাজ করছেন তাতে উভয় ক্যাপচার কীভাবে পুনরুদ্ধার করবেন তা আপনাকে কেবল জানতে হবে।
rbsdca

137

ট্যাগটি অন্য লাইনে শেষ করা যেতে পারে। এ কারণেই \nযুক্ত করা দরকার।

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

5
(.|\n)*?একাধিক লাইন জুড়ে এইচটিএমএল ট্যাগ নিয়ে কাজ করার সময় যোগ করার বিষয়ে গুরুত্বপূর্ণ বিষয় । এইচটিএমএল ট্যাগগুলি একই লাইনে থাকলে কেবলমাত্র নির্বাচিত উত্তর কাজ করে।
ক্যালিয়ানহপকিন্স

3
<Pre> (| \ N |। \ R \ N)? * <\ / Pre> উইন্ডোজ লাইন শেষা w শ জন্য
মার্ক

3
(.|\n)*?কোনও চরের সাথে মেলে কখনও ব্যবহার করবেন না । সর্বদা (একক লাইন) সংশোধক .সহ ব্যবহার করুন s। বা একটি [\s\S]*?workaround।
উইক্টর স্ট্রিবিউ

আমি নোটপ্যাড ++ এ কোড মন্তব্য নির্বাচন করতে চেয়েছিলাম, তাই এই উত্তরটি ব্যবহার করে আমি /\*(.|\n)*?\*/কাজটি নিয়ে এসেছি - ধন্যবাদ
উইকিল

নিখুঁত উত্তর অনেক ধন্যবাদ
ওমদা

25

এটি আমি ব্যবহার করব।

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

মূলত এটি যা করে তা হ'ল:

(?<=(<pre>))<pre>ট্যাগটি সহ বাছাই করতে হবে end

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )এটি কেবল একটি নিয়মিত প্রকাশ যা আমি প্রয়োগ করতে চাই। এই ক্ষেত্রে, এটি অক্ষর বা অঙ্ক বা নিউলাইন চরিত্র বা বর্গবন্ধ বন্ধনীর উদাহরণে তালিকাভুক্ত কিছু বিশেষ অক্ষর নির্বাচন করে। পাইপের চরিত্রটির |সহজ অর্থ " OR "।

+?প্লাস চরিত্রটি উপরের এক বা একাধিকটি নির্বাচন করতে বলে - অর্ডারটি কোনও ব্যাপার নয়। প্রশ্ন চিহ্ন ডিফল্ট আচরণকে 'লোভী' থেকে 'উর্দ্ধে' পরিবর্তন করে।

(?=(</pre>))</pre>ট্যাগটি দিয়ে বাছাই করতে হবে

এখানে চিত্র বর্ণনা লিখুন

আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনাকে কিছু সংশোধক ( আই বা এম ) যুক্ত করতে হতে পারে

  • i - কেস-সংবেদনশীল
  • m - বহু-লাইন অনুসন্ধান

এখানে আমি এই অনুসন্ধানটি সাব্লাইম পাঠ্যে সম্পাদন করেছি যাতে আমার রেগেজেমে কোনও সংশোধক ব্যবহার করতে হবে না।

জাভাস্ক্রিপ্ট চেহারা পিছনে সমর্থন করে না

উপরের উদাহরণটি পিএইচপি, পার্ল, জাভা ইত্যাদির মতো ভাষাগুলির সাথে সূক্ষ্মভাবে কাজ করা উচিত ... জাভাস্ক্রিপ্ট যদিও চেহারাটির পিছনে সমর্থন করে না তাই আমাদের ব্যবহারের কথা ভুলে যেতে হবে (?<=(<pre>))এবং একরকম কাজ করার সন্ধান করতে হবে। ট্যাগগুলির মধ্যে এখানে রেজেজেক্স ম্যাচ পাঠানোর মতো প্রতিটি নির্বাচনের জন্য আমাদের ফলাফল থেকে প্রথম চারটি অক্ষরটি সহজ সরান

নন-ক্যাপচারিং বন্ধনীগুলির জন্য জাভাস্ক্রিপ্ট রেগেক্স ডকুমেন্টেশনও দেখুন


নোট করুন যে স্ট্রিংয়ে রিজেপ্সপ রাখতে আপনার একক / ডাবল উদ্ধৃতি অক্ষরগুলি এড়াতে হবে।
ডেভিড জাওয়ার্ট

18

উপাদানগুলির মধ্যে সামগ্রী পেতে নীচের প্যাটার্নটি ব্যবহার করুন। [tag]আপনি যে সামগ্রীটি থেকে বের করতে চান সেই প্রকৃত উপাদানটি দিয়ে প্রতিস্থাপন করুন ।

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

কিছু সময় ট্যাগগুলিতে anchorট্যাগ থাকার মতো বৈশিষ্ট্য থাকবে href, তারপরে নীচের প্যাটার্নটি ব্যবহার করুন।

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

'<হেড> (। +?) </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 ট্যাগ


@ কৃষ্ণ ঠাকুরের উত্তরে এই চেহারাটি ব্যবহার করা লোকেরা এই লিখিত বিষয়বস্তুতে ট্যাগগুলির মধ্যে নতুন লাইন রয়েছে কিনা তাও বিবেচনা করতে পারে
কিংকং কোডার

এটি আমার ক্ষেত্রে সহায়তা করেছে (নতুন লাইনগুলি বিবেচনা করার প্রয়োজন নেই)। ধন্যবাদ।
পিকেটিং

6

আপনার এইচটিএমএলকে রেজিক্সগুলির বিশ্লেষণ করার চেষ্টা করা উচিত নয় এবং এই প্রশ্নটি কীভাবে পরিণত হয়েছিল তা দেখুন।

সহজ কথায়, এইচটিএমএল কোনও নিয়মিত ভাষা নয় তাই আপনি নিয়মিত প্রকাশের সাথে পুরোপুরি বিশ্লেষণ করতে পারবেন না।

এমন কথা বলার পরে যে যখন কোনও নেস্টেড নেস্টেড নেই তখন আপনি এইচটিএমএল এর সাবটাইটগুলি পার্স করতে পারেন। এতক্ষণ যে কোনও কিছু নিজেই যে ট্যাগের মধ্যে না থাকে এবং না হয়, এটি কাজ করবে:

preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )

আরও ভাল ধারণাটি হল আপনার এইচটিএমএল লোড করার জন্য নেটিভ ডোমডকুমেন্টের মতো পার্সার ব্যবহার করা, তারপরে আপনার ট্যাগটি নির্বাচন করুন এবং অভ্যন্তরীণ এইচটিএমএল পাবেন যা দেখতে এরকম কিছু দেখতে পাবে:

$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();

এবং যেহেতু এটি যথাযথ পার্সার তাই এটি নেস্টিং ট্যাগ ইত্যাদি পরিচালনা করতে সক্ষম হবে


2
শুধু আমি বলতে চাই যে আমি সামান্য বিড়ম্বিত হয়েছি যে এটি এখনও নিম্নগামীদের সংগ্রহ করছে যখন এটিই একমাত্র উত্তর যা রেগেক্সের পাশে একটি সঠিক সমাধান সরবরাহ করে এবং আমি যথেষ্ট সতর্কতাও যুক্ত করেছি যে এটি সম্ভবত সঠিক উপায় নয় ... কমপক্ষে আমার উত্তর সম্পর্কে এতটা ভুল সম্পর্কে মন্তব্য করুন, দয়া করে।
স্যাজি

1
প্রশ্নটি দিয়ে ট্যাগ করা হয়নি php। পিএইচপি কীভাবে ছবিতে এসেছিল তা নিশ্চিত নয় ...
ট্রাইঙ্কট

@ ট্রিনকোট এটি 7 বছরেরও বেশি আগে ছিল, তাই আমি মনে করতে পারি না। যে কোনও ক্ষেত্রে এটি একটি রেইজেক্স এবং পার্সার দিয়ে সমস্যা সমাধানের উদাহরণ। রেজেক্স ভাল এবং পিএইচপি হ'ল সেই সময়ে আমি ভাল করে জানতাম।
স্যাজি

আমি বুঝতে পেরেছি, আমি আপনার প্রথম মন্তব্যটি দেখেছি এবং ভেবেছিলাম যে এটি কিছু নিম্নগতির ব্যাখ্যা করতে পারে।
ট্রিনকোট

5

এটা চেষ্টা কর....

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

3
নোট করুন যে পিছনের চেহারাটি জাভাস্ক্রিপ্টে সমর্থিত নয়।
allicarn

অবশ্যই, তবে এই রেজেক্সটি জাভার জন্য। আপনার নোট জন্য ধন্যবাদ।
Heriberto Rivera

4

এটি আমার কাছে পাওয়া সমস্তগুলির মধ্যে সবচেয়ে সাধারণ নিয়মিত প্রকাশ বলে মনে হয়

(?:<TAG>)([\s\S]*)(?:<\/TAG>)
  1. (?:<TAG>)ম্যাচগুলি থেকে খোলার ট্যাগ বাদ দিন
  2. ([\s\S]*)ম্যাচগুলিতে কোনও হোয়াইটস্পেস বা শ্বেতস্থান অক্ষর অন্তর্ভুক্ত করুন
  3. (?:<\/TAG>)ম্যাচগুলি থেকে ক্লোজিং ট্যাগ বাদ দিন

3

এই উত্তরটি আশেপাশের দেখার জন্য সমর্থনটি মনে করে! এটি আমাকে ট্যাগ খোলা এবং বন্ধের জোড়ার মধ্যে সমস্ত পাঠ্য সনাক্ত করতে দেয় identify এটি '>' এবং '<' এর মধ্যে সমস্ত পাঠ্য। এটি কাজ করে কারণ চারপাশে দেখা চরিত্রগুলির সাথে মেলে না।

(? <=>) ([\ W \ গুলি] + +) (? = </)

আমি এটি এইচটিএমএল খণ্ডটি ব্যবহার করে 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 সাইটের একটি দুর্দান্ত লিঙ্ক। সম্মত! 🙂
সান ফিল্ডম্যান

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 ট্যাগ মধ্যে alling নির্বাচন করবে। এটি কোনও নতুন লাইনে নয় (মাল্টলাইন দিয়ে কাজ করুন)।


1

পাইথনে, 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
শব্দগুলি ব্যবহার করে আপনার উত্তরটি বর্ণনা করুন / ব্যাখ্যা করুন
অ্যান্ড্রু রেগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.