XML සහ විශේෂයෙන් HTML විග්රහ කිරීමට නිවැරදි මෙවලම විග්රහයක් මිස සාමාන්ය ප්රකාශන එන්ජිමක් නොවන බව මම එකඟ වෙමි . කෙසේ වෙතත්, අනෙක් අය පෙන්වා දී ඇති පරිදි, සමහර විට රීජෙක්ස් භාවිතා කිරීම ඉක්මන්, පහසු වන අතර දත්ත ආකෘතිය ඔබ දන්නේ නම් එම කාර්යය ඉටු කරයි.
මයික්රොසොෆ්ට් ඇත්ත වශයෙන්ම .NET රාමුව තුළ නිත්ය ප්රකාශන සඳහා හොඳම පරිචයන්හි කොටසක් ඇති අතර ආදාන ප්රභවය සලකා බැලීම ගැන විශේෂයෙන් කථා කරයි .
නිත්ය ප්රකාශනවල සීමාවන් ඇත, නමුත් ඔබ පහත කරුණු සලකා බැලුවද?
කණ්ඩායම් අර්ථ දැක්වීම් සමතුලිත කිරීම සඳහා නිත්ය ප්රකාශන සඳහා .NET රාමුව අද්විතීය වේ.
මේ හේතුව නිසා, සාමාන්ය ප්රකාශන භාවිතයෙන් ඔබට XML විග්රහ කළ හැකි යැයි මම විශ්වාස කරමි. කෙසේ වෙතත්, එය වලංගු XML විය යුතු බව සලකන්න ( බ්රව්සර් HTML වලට සමාව දෙන අතර HTML තුළ නරක XML සින්ටැක්ස් වලට ඉඩ දෙයි ). "සමතුලිත කණ්ඩායම් අර්ථ දැක්වීම" මඟින් සාමාන්ය ප්රකාශන එන්ජිමට PDA ලෙස ක්රියා කිරීමට ඉඩ ලබා දෙන බැවින් මෙය කළ හැකිය.
ඉහත සඳහන් කළ 1 වන වගන්තියේ උපුටා ගැනීම:
.නෙට් නිත්ය ප්රකාශන එන්ජිම
ඉහත විස්තර කර ඇති පරිදි නිසි ලෙස සමතුලිත ඉදිකිරීම් නිත්ය ප්රකාශනයකින් විස්තර කළ නොහැක. කෙසේ වෙතත්, .NET නිත්ය ප්රකාශන එන්ජිම මගින් සමතුලිත ඉදිකිරීම් හඳුනා ගැනීමට ඉඩ සලසන ඉදිකිරීම් කිහිපයක් සපයයි.
(?<group>)
- ග්රහණය කරගත් ප්රති result ලය ග්රහණ තොගයේ නාම කණ්ඩායම සමඟ තල්ලු කරයි.
(?<-group>)
- ග්රහණය කර ගත් තොගයෙන් පිටත නාම කණ්ඩායම සමඟ ඉහළම ග්රහණය කර ගනී.
(?(group)yes|no)
- නම කණ්ඩායම සමඟ කණ්ඩායමක් සිටී නම් ඔව් කොටසට ගැලපේ.
මෙම ඉදිකිරීම් මඟින් .NET නිත්ය ප්රකාශනයකට සීමිත PDA අනුකරණය කිරීමට ඉඩ ලබා දේ. සරල මෙහෙයුම් පිළිවෙලින් වර්ධක, අඩුවීම හා ශුන්යයට සමාන වේ. .NET නිත්ය ප්රකාශන එන්ජිමට සන්දර්භය රහිත භාෂාවල උප කුලකයක් හඳුනා ගැනීමට මෙය ඉඩ දෙයි, විශේෂයෙන් සරල කවුන්ටරයක් පමණක් අවශ්ය වන ඒවා. සාම්ප්රදායික නොවන .නෙට් නිත්ය ප්රකාශන මගින් නිසි ලෙස සමතුලිත ඉදිකිරීම් හඳුනා ගැනීමට මෙය ඉඩ දෙයි.
පහත දැක්වෙන නිත්ය ප්රකාශනය සලකා බලන්න:
(?=<ul\s+id="matchMe"\s+type="square"\s*>)
(?>
<!-- .*? --> |
<[^>]*/> |
(?<opentag><(?!/)[^>]*[^/]>) |
(?<-opentag></[^>]*[^/]>) |
[^<>]*
)*
(?(opentag)(?!))
කොඩි භාවිතා කරන්න:
- තනි රේඛාව
- IgnorePatternWhitespace (ඔබ රීජෙක්ස් කඩා සියලු සුදු අවකාශය ඉවත් කරන්නේ නම් අවශ්ය නොවේ)
- IgnoreCase (අවශ්ය නොවේ)
නිත්ය ප්රකාශන පැහැදිලි කිරීම (පේළිගත කිරීම)
(?=<ul\s+id="matchMe"\s+type="square"\s*>) # match start with <ul id="matchMe"...
(?> # atomic group / don't backtrack (faster)
<!-- .*? --> | # match xml / html comment
<[^>]*/> | # self closing tag
(?<opentag><(?!/)[^>]*[^/]>) | # push opening xml tag
(?<-opentag></[^>]*[^/]>) | # pop closing xml tag
[^<>]* # something between tags
)* # match as many xml tags as possible
(?(opentag)(?!)) # ensure no 'opentag' groups are on stack
ඔබට මෙය වඩා හොඳ .නෙට් නිත්ය ප්රකාශන පරීක්ෂකයකින් උත්සාහ කළ හැකිය .
මම නියැදි ප්රභවය භාවිතා කළෙමි:
<html>
<body>
<div>
<br />
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
</div>
</body>
</html>
මෙය තරගය සොයා ගත්තේය:
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
එය ඇත්ත වශයෙන්ම මේ ආකාරයට එළියට ආවත්:
<ul id="matchMe" type="square"> <li>stuff...</li> <li>more stuff</li> <li> <div> <span>still more</span> <ul> <li>Another >ul<, oh my!</li> <li>...</li> </ul> </div> </li> </ul>
අවසාන වශයෙන්, ජෙෆ් ඇට්වුඩ්ගේ ලිපිය: Parsing Html The Cthulhu Way . විනෝදජනක ලෙස, එය දැනට ඡන්ද 4k ඉක්මවා ඇති මෙම ප්රශ්නයට පිළිතුර උපුටා දක්වයි.