රෙජෙක්ස් XHTML ස්වයං අන්තර්ගත ටැග් හැර විවෘත ටැග් වලට ගැලපේ


1501

මට මෙම ආරම්භක ටැග් සියල්ල ගැලපීමට අවශ්‍යයි:

<p>
<a href="foo">

නමුත් මේවා නොවේ:

<br />
<hr class="foo" />

මම මෙය ඉදිරිපත් කළ අතර මට එය නිවැරදිව ඇති බවට සහතික කර ගැනීමට අවශ්‍ය විය. මම අල්ලා ගන්නේ පමනි a-z.

<([a-z]+) *[^/]*?>

එය විශ්වාස කරන බව මම විශ්වාස කරමි.

  • ඊට වඩා අඩුවෙන් සොයා ගන්න
  • Az එකක් හෝ කිහිපයක් සොයා ගන්න (සහ අල්ලා ගන්න), පසුව
  • එවිට ශුන්‍ය හෝ වැඩි ඉඩ ප්‍රමාණයක් සොයා ගන්න
  • කෑදරකම, හැර /, හැර වෙනත් ඕනෑම චරිතයක් ශුන්‍ය හෝ වැඩි වාරයක් සොයා ගන්න
  • වඩා විශාල සොයා ගන්න

මට ඒ අයිතිය තිබේද? වැදගත්ම දෙය නම්, ඔබ සිතන්නේ කුමක්ද?

Answers:


4415

ඔබට [X] HTML රීජෙක්ස් සමඟ විග්‍රහ කළ නොහැක. HTML රීජෙක්ස් මගින් විග්‍රහ කළ නොහැකි බැවිනි. රීජෙක්ස් යනු HTML නිවැරදිව විග්‍රහ කිරීමට භාවිතා කළ හැකි මෙවලමක් නොවේ. මම මීට පෙර මෙතරම් වාර ගණනක් HTML සහ regex ප්‍රශ්න වලට පිළිතුරු දී ඇති පරිදි, රීජෙක්ස් භාවිතය ඔබට HTML පරිභෝජනයට ඉඩ නොදේ. නිත්‍ය ප්‍රකාශන යනු HTML විසින් භාවිතා කරන ඉදිකිරීම් තේරුම් ගැනීමට ප්‍රමාණවත් තරම් නවීන නොවන මෙවලමකි. HTML සාමාන්‍ය භාෂාවක් නොවන අතර එබැවින් සාමාන්‍ය ප්‍රකාශන මගින් විග්‍රහ කළ නොහැක. HTML එහි අර්ථවත් කොටස් වලට බිඳ දැමීමට රීජෙක්ස් විමසුම් සතුව නොමැත. බොහෝ වාර ගණනක් නමුත් එය මට නොලැබේ. පර්ල් විසින් භාවිතා කරන ලද වැඩි දියුණු කරන ලද අක්‍රමවත් නිත්‍ය ප්‍රකාශන පවා HTML විග්‍රහ කිරීමේ කාර්යය නොවේ. ඔයා කවදාවත් මාව කඩන්නේ නැහැ. HTML යනු නිත්‍ය ප්‍රකාශන මගින් විග්‍රහ කළ නොහැකි තරම් සංකීර්ණ භාෂාවකි. ජෝන් ස්කීට් හට පවා සාමාන්‍ය ප්‍රකාශන භාවිතයෙන් HTML විග්‍රහ කළ නොහැක. ඔබ නිතිපතා ප්‍රකාශන සමඟ HTML විග්‍රහ කිරීමට උත්සාහ කරන සෑම අවස්ථාවකම, අශුද්ධ දරුවා කන්‍යාවන්ගේ ලේ හ ep ා වැලපෙන අතර රුසියානු හැකර්වරු ඔබේ වෙබ් ඇප් එක උකස් කරති. රීජෙක්ස් කැඳවීම් සමඟ HTML විග්‍රහ කිරීම ආත්මයන් ජීවමාන ක්ෂේත්‍රයට කැළලක් ඇති කරයි. ආදරය, විවාහය සහ චාරිත්‍රානුකූල ළදරු icide ාතනය වැනි HTML සහ රීජෙක්ස් එකට ගමන් කරයි. <center> ට එය ප්‍රමාද කළ නොහැක. එකම සංකල්පීය අවකාශයක් තුළ රීජෙක්ස් සහ HTML වල බලය එක්ව ඔබේ මනස විනාශකාරී ජලයෙන් පිරී යයි. ඔබ HTML රීජෙක්ස් සමඟ විග්‍රහ කරන්නේ නම්, ඔබ ඔවුන්ට ලබා දෙන අපහාසාත්මක ක්‍රම සහ මූලික බහුභාෂා ගුවන්යානයේ නම ප්‍රකාශ කළ නොහැකි තැනැත්තා වෙනුවෙන් අමානුෂික වෙහෙසක් දැරීමට අප සැවොම පෙළඹේ නම්, ඔහු පැමිණේ. HTML-plus-regexp ඔබ නිරීක්‍ෂණය කරන අතරම, මනෝභාවයේ දෝංකාරය දියකර හරිනු ඇත.එය ප්‍රමාද වැඩියි ප්‍රමාද වැඩියි අපට බේරා ගත නොහැක චිල්ඩ්ගේ ආතතිය රීජෙක්ස් සියළුම ජීව පටක පරිභෝජනය කරන බව සහතික කරයි (HTML හැරෙන්නට, එය පෙර අනාවැකි කිව නොහැකි) ආදරණීය ස්වාමීනි අපට රීජෙක්ස් භාවිතා කර විග්‍රහ කිරීමට ඕනෑම කෙනෙකුට මෙම වසංගතයෙන් බේරෙන්නේ කෙසේද? HTML සැකසීම සඳහා මෙවලමක් ලෙස රීජ් x භාවිතා කරමින් HTML මානව වර්ගයා සදාකාලික භයානක වධහිංසා හා ආරක්ෂක සිදුරුවලට ඇද දමා ඇත. මෙම ලෝකය සහ සීරෝරප්ට් ආයතනවල (SGML ආයතන වැනි, නමුත් වඩා දූෂිත) භයානක යථාර්ථය අතර කඩඉමක් ඇති කරයි. reg ලෝක HTML සඳහා හිටපු parsers ඇත ඉන් ගැහුව්වා ප්රවාහන ap rogrammer විඥානය මම nto AW ORL කෑගැසීම, අනවරතයෙන් ක ඈ, ඔහු එන්නේමෙම pestilent slithy regex-ආසාදන wil ඔබගේ HT ගිල l දෘශ්ය මූලික වැනි, කාලයක් සඳහා, එල් ව්යාකරණ විග්රහ කිරීම, මෘදුකාංග හා පැවැත්ම නරක අතට ඔහු com එන ඔහු f fing o ඊ බොරුව මිනිසා සියලු අහිමි වෙයි ඒ ෙ LL මම ශ්රී ලංකා ඒ මරණය වන ඊ ඔහු පැමිණ Ponyes fi නැහැ ght ඌ ඊ එන, Hi ගේ අශුද්ධ, ඉතින්, ද සියලු බුද්ධත්වයට stro҉ying, HTML ටැග් අයුරින් අනුමාන ප්රශ්න සකසා කලින් ලබාදීම fr̶ǫm යෝ ඌර් ඇස් වැනි liq UID පි ශාඛාවයි, නැවත සාමාන්ය exp ගීතය ssion අන්තහ්කරණය exti ඇත හඬවල් nguish මෙම සම්මන්ත්රණයේ දී ඇති එස්පී සිට Tal මිනිසා මෙහි මම එය ලස්සන ටී වන්නේ එය ඔබට බලන්න පුළුවන් බලන්න පුළුවන් ඒක ඔහු com es ඔහු සම මට ටී s ඔහු Ich හෝ permeat es අල් l මගේ පාඩුව අවම ඊ මගේ මුහුණ ᵒh දෙවියන් n නැත NOO̼ o සාමාන්ය මත Θ නැවතුම් ටී ඔහු * ̶͑̾̾ ජී.එල් eS ninal snuf ͎a̧͈͖r̽̾̈́͒͑eOt rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ T. O͇̹̺ͅƝ̴ȳ̳ TH̘ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ S̨̥̫͎̭ͯ̿̔̀ͅ


ඒ වෙනුවට ඔබ XML විග්‍රහකයක් භාවිතා කිරීමට උත්සාහ කර තිබේද?


උපපරිපාලක වරුගේ සටහන

එහි අන්තර්ගතයට නුසුදුසු සංස්කරණයන් වැළැක්වීම සඳහා මෙම සටහන අගුළු දමා ඇත. පෝස්ට් එක හරියටම පෙනෙන ආකාරයට පෙනේ - එහි අන්තර්ගතය සමඟ කිසිදු ගැටළුවක් නොමැත. කරුණාකර අපගේ අවධානය සඳහා එය සලකුණු නොකරන්න.


179
කෝබි: සහකාර තනතුරෙන් ඉවත් වීමට කාලය පැමිණ ඇතැයි මම සිතමි. අපි කී වතාවක් කීවත්, ඔවුන් සෑම දිනකම පැමිණීම නවත්වන්නේ නැත ... සෑම පැයකටම පවා. එය නැතිවූ හේතුවක් වන අතර, වෙනත් කෙනෙකුට ටිකක් සටන් කළ හැකිය. එබැවින් ඉදිරියට යන්න, ඔබට අවශ්‍ය නම් HTML රීජෙක්ස් සමඟ විග්‍රහ කරන්න. එය බිඳුණු කේතය මිස ජීවිතය හා මරණය නොවේ.
බොබින්ස්

27
මෙම පිළිතුර විග්‍රහ කිරීමට RegEx භාවිතා කළ හැකිද?
ක්‍රිස් පෝටර්

2
ඔබට මෙම ලිපිය දැකිය නොහැකි නම්, මෙහි සියලු තේජසින් එහි තිර පිටපතක් ඇත: imgur.com/gOPS2.png
ඇන්ඩ rew කීටන්

3261

අතර අත්තනෝමතික වන regex පමණක් HTML නොහැකි වන අතර, එය සමහර විට මාණකරනය ක්රියාත්මක කිරීම සඳහා ඒවා භාවිතා කිරීම සුදුසු වෙන්නේ සීමිත, දන්නා HTML කට්ටලයක්.

ඔබට දත්ත සීරීමට හා පසුව දත්ත සමුදායක් තුළට ගෙන යාමට අවශ්‍ය කුඩා HTML පිටු සමූහයක් තිබේ නම්, රීජෙක්ස් හොඳින් ක්‍රියා කරයි. උදාහරණයක් ලෙස, මෑතකදී මට අවශ්‍ය වූයේ ඕස්ට්‍රේලියානු ෆෙඩරල් නියෝජිතයින්ගේ නම්, පක්ෂ සහ දිස්ත්‍රික්ක ලබා ගැනීමටයි. ඒවා පාර්ලිමේන්තුවේ වෙබ් අඩවියෙන් ඉවත් විය. මෙය සීමිත, එක් වරක් කළ රැකියාවක් විය.

රෙජෙක්ස් මට හොඳින් වැඩ කළ අතර ඒවා සැකසීමට ඉතා වේගවත් විය.


131
එසේම, විශාල ලේඛන වලින් නිතිපතා ආකෘතිගත කරන ලද දත්ත සීරීමට වඩා සාමාන්‍ය ස්කෑන් සහ රීජෙක්ස් භාවිතා කිරීම වේගවත් වනු ඇත. රීජෙක්ස් කේත කිරීම ඔබට පහසු නම්, xpaths කේත කිරීමට වඩා වේගයෙන් කේත කරන්න. ඔබ සීරීමට ලක් කරන දේවල වෙනස්වීම් වලට වඩා බිඳෙන සුළුය. ඉතින් බ්ලී.
මයිකල් ජොන්ස්ටන්

257
Ic මයිකල් ජොන්ස්ටන් "අඩු බිඳෙන සුළු"? පාහේ නැත. එක්ස්එම්එල් විග්‍රහකයෙකුට නිහ ly ව නොසලකා හැරිය හැකි ප්‍රමාණයට වඩා රෙජෙක්ස් පෙළ හැඩතල ගැන්වීමේ තොරතුරු ගැන සැලකිලිමත් වේ. &foo;කේතීකරණ සහ CDATAකොටස් අතර මාරු වීම ? බ්‍රව්සරය ඉදිරිපත් නොකරන ඔබගේ ලේඛනයේ ඇති සියලුම හිස් අවකාශය ඉවත් කිරීමට HTML මිනිෆයර් භාවිතා කිරීම? එක්ස්එම්එල් විග්‍රහ කරන්නෙකු එය ගණන් ගන්නේ නැත, හොඳින් ලියා ඇති එක්ස්පාත් ප්‍රකාශයක් ද නොකරයි. රීජෙක්ස් මත පදනම් වූ "පාර්සර්", අනෙක් අතට ...
චාල්ස් ඩෆි

41
Har චාර්ල්ස් ඩෆි එක් වරක් කරන රැකියාවක් සඳහා කමක් නැත, සහ අවකාශයන් සඳහා අපි \ s +
ක්වොන්ටම්

69
@xiaomao ඇත්ත වශයෙන්ම, 80% ක විසඳුමක් ලබා ගැනීම සඳහා සියලු ගොචා සහ වැඩකරන දැන ගැනීම "ඉතිරි කාලය" ඔබ වෙනුවෙන් වැඩ කරයි "අසමත් වුවහොත් මට ඔබව නවත්වන්න බැහැ. මේ අතර, කෘතිමව වලංගු XML වලින් 100% ක් වැඩ කරන පාර්සර් භාවිතා කරමින් මම වැටේ මගේ පැත්තේ සිටිමි.
චාල්ස් ඩෆි

377
මට වරක් HTML 10k පිටු වලින් දත්ත කිහිපයක් ඇද ගැනීමට සිදු විය, සියල්ලම එකම HTML අච්චුවක් ඇත. ඒවා HTML දෝෂයන්ගෙන් පිරී ඇති අතර එමඟින් විග්‍රහ කරන්නන් හුස්ම හිරවී ඇති අතර, ඔවුන්ගේ සියලු මෝස්තර පේළිගතව හෝ වෙනත් <font>යනාදිය සමඟ විය . "නිවැරදි" ප්රවේශය සමඟ දවස පුරා සටන් කිරීමෙන් පසුව, මම අවසානයේ රීජෙක්ස් විසඳුමකට මාරු වී පැයකින් එය ක්රියාත්මක කළෙමි.
පෝල් ඒ ජුන්ග්විත්

2046

මෙහි ඇති අඩුපාඩුව නම් HTML යනු චොම්ස්කි වර්ගයේ 2 ව්‍යාකරණ (සන්දර්භය රහිත ව්‍යාකරණ) සහ රෙජෙක්ස් යනු චොම්ස්කි වර්ගයේ 3 ව්‍යාකරණ (සාමාන්‍ය ව්‍යාකරණ) ය. . දෙවන වර්ගයේ ව්‍යාකරණ 3 වන ව්‍යාකරණයට වඩා මූලික වශයෙන් සංකීර්ණ බැවින් ( චොම්ස්කි ධූරාවලිය බලන්න ), රෙජෙක්ස් සමඟ එක්ස්එම්එල් විග්‍රහ කිරීම ගණිතමය වශයෙන් කළ නොහැකි ය .

නමුත් බොහෝ දෙනෙක් උත්සාහ කරනු ඇත, සමහරු සාර්ථකත්වය පවා ප්‍රකාශ කරනු ඇත - නමුත් අනෙක් අය වරද සොයාගෙන ඔබව සම්පූර්ණයෙන්ම අවුල් කරන තුරු.


228
XHTML හි ආරම්භක උප කුලකයක් විග්‍රහ කිරීමට OP ඉල්ලා සිටී: ආරම්භක ටැග්. (X) HTML CFG බවට පත් කරන්නේ වෙනත් මූලද්‍රව්‍යයන්ගේ ආරම්භක හා අවසාන ටැග් අතර (ව්‍යාකරණ රීතියකට අනුව A -> s A e) මූලද්‍රව්‍ය තිබීමට ඇති හැකියාවයි . (X) HTML හි ආරම්භක ටැගයක් තුළ මෙම දේපල නොමැත : ආරම්භක ටැගයක වෙනත් ආරම්භක ටැග් අඩංගු විය නොහැක. OP විග්‍රහ කිරීමට උත්සාහ කරන උප කුලකය CFG නොවේ.
LarsH

102
සීඑස් න්‍යායට අනුව, සාමාන්‍ය භාෂා යනු සන්දර්භයෙන් තොර භාෂාවල දැඩි උප කුලකයක් වන නමුත් ප්‍රධාන ධාරාවේ ක්‍රමලේඛන භාෂාවල නිත්‍ය ප්‍රකාශන ක්‍රියාත්මක කිරීම වඩා බලවත් ය. ලෙස noulakaz.net/weblog/2007/03/18/... විස්තර, ඊනියා "සාමාන්ය ප්රකාශනයක" ප්රථමක සංඛ්යා සඳහා ඒකජ දී, නිසැකව CS න්යාය සිට සාමාන්ය ප්රකාශිත සාර්ථකව ඉටු කළ නොහැකි දෙයක් වන පරීක්ෂා කර ගත හැක.
ඇඩම් මිහාල්සින්

12
yeeelidlessness: සියලුම CFG වලට එකම “නම්” පමණක් අදාළ වේ, එසේ නොවේ ද? එනම් (X) HTML ආදානය නිසි ලෙස සකසා නොමැති නම්, පූර්ණ ලෙස පිම්බුණු XML විග්‍රහකය පවා විශ්වාසදායක ලෙස ක්‍රියා නොකරනු ඇත. සමහර විට ඔබ සඳහන් කරන “(X) HTML සින්ටැක්ස් දෝෂ සැබෑ ලෝක පරිශීලක නියෝජිතයන් තුළ ක්‍රියාත්මක කරන්නේ නම්, ඔබ වඩා හොඳ වන්නේ කුමක් දැයි මට වැටහෙනු ඇත.
LarsH

83
D ඇඩම් මිහාල්සින් හරියටම හරි. බොහෝ දැනට පවතින රීජෙක්ස් එන්ජින් චොම්ස්කි වර්ගයේ 3 ව්‍යාකරණ වලට වඩා බලවත් ය (උදා: කෑදර නොවන ගැලපීම්, බැක්රෙෆ්). සමහර රීජෙක්ස් එන්ජින් (පර්ල්ස් වැනි) ටියුරින් සම්පූර්ණයි. ඒවා පවා HTML විග්‍රහ කිරීම සඳහා දුර්වල මෙවලම් බව සත්‍යයකි, නමුත් බොහෝ විට උපුටා දක්වන ලද මෙම තර්කය එයට හේතුව නොවේ.
dubiousjim

27
මෙහි වඩාත්ම "පූර්ණ හා කෙටි" පිළිතුර මෙයයි. විධිමත් ව්‍යාකරණ හා භාෂාවන්හි මූලික කරුණු ඉගෙන ගැනීමටත්, සමහර ගණිතයන් ඉගෙන ගැනීමටත් එය මඟ පෙන්වයි, එබැවින් බහුපද කාලවලදී එන්පී කාර්යයන් විසඳීම වැනි බලාපොරොත්තු රහිත දේවල් සඳහා ඔවුන් කාලය නාස්ති නොකරනු ඇත
මිෂ්මාෂ්රු

1337

මේ අයට ඇහුම්කන් දෙන්න එපා. ඔබ කාර්යය කුඩා කැබලිවලට කැඩුවහොත් ඔබට සන්දර්භය රහිත ව්‍යාකරණ රීජෙක්ස් සමඟ විග්‍රහ කළ හැකිය . මේ සෑම දෙයක්ම පිළිවෙලට කරන ස්ක්‍රිප්ට් එකකින් ඔබට නිවැරදි රටාව ජනනය කළ හැකිය:

  1. හැල්ටිං ගැටළුව විසඳන්න.
  2. රවුමක් වර්ග කරන්න.
  3. O (log n) හෝ ඊට අඩු සංචාරක විකුණුම්කරුගේ ගැටලුව විසඳන්න. එය ඊට වඩා වැඩි යමක් නම්, ඔබ RAM එකෙන් ඉවතට යන අතර එන්ජිම ක්‍රියාත්මක වේ.
  4. රටාව සෑහෙන්න විශාල වනු ඇත, එබැවින් අහඹු දත්ත නැතිවීමකින් තොරව සම්පීඩනය කරන ඇල්ගොරිතමයක් ඔබට ඇති බවට වග බලා ගන්න.
  5. පාහේ එහි - සියල්ලම ශුන්‍යයෙන් බෙදන්න. පහසු-පීසි.

මම අවසාන කොටස මුළුමනින්ම අවසන් කර නැත, නමුත් මම දන්නවා මම ළං වන බව. එය CthulhuRlyehWgahnaglFhtagnExceptionකිසියම් හේතුවක් නිසා දිගින් දිගටම විසි කරයි , එබැවින් මම එය VB 6 වෙත ගෙන ගොස් භාවිතා කරමිOn Error Resume Next . බිත්තියේ විවෘත කර ඇති මෙම අමුතු දොර ගැන සොයා බැලූ පසු මම කේතය සමඟ යාවත්කාලීන කරමි. හ්ම්.

පීඑස් පියරේ ද ෆර්මාට් ද එය කරන්නේ කෙසේදැයි හදුනා ගත්තේය, නමුත් ඔහු ලියන ආන්තිකය කේතයට ප්‍රමාණවත් නොවීය.


80
ඔබ සඳහන් කරන අනෙක් ඒවාට වඩා ශුන්‍යයෙන් බෙදීම වඩා පහසු ගැටළුවකි. සරල පාවෙන ලක්ෂ්‍ය අංක ගණිතයට වඩා (ඔබ සියල්ලන්ම විය යුතු නමුත් කිසිවෙකු නොසිටින) කාල පරතරයන් භාවිතා කරන්නේ නම්, ඔබට ශුන්‍යයෙන් [අඩංගු කාල පරතරයකින්] සතුටින් යමක් බෙදිය හැකිය. ප්‍රති result ලය හුදෙක් ප්ලස් සහ us ණ අනන්තය අඩංගු පරතරයකි.
rjmunro

149
ෆර්මැට් හි කුඩා ආන්තික ගැටළුව නවීන පෙළ සංස්කරණ මෘදුකාංගවල මෘදු ආන්තිකයන් මගින් විසඳා ඇත.
kd4ttc

51
ෆොන්මාට් හි කුඩා ආන්තික ගැටළුව රන්දෝල් මුන්රෝ විසින් අකුරු ප්‍රමාණය ශුන්‍යයට සකසා ඇත: xkcd.com/1381
හෙල්ටන්බිකර්

30
FYI: ලෙස සාධාරණීකරණය ගැටළුව ඇති ඇත්තටම 1995 දී විසඳී , සහ එය පමණක් එසේ කිරීමට වසර 358 ගණිතඥයන් ය.
jmiserez

10
සීතල විලයනයෙන් ලැබෙන බ්‍රව්නියානු මීයන් භාවිතා කිරීමෙන් එම ඇලෙන සුළු බෙදීම්-ශුන්‍ය පියවර මග හැරීමට මට හැකි විය ... එය ක්‍රියාත්මක වන්නේ මම විශ්වීය නියතය ඉවත් කළ විට පමණි.
ටිම් ලෙහ්නර්

1078

වියාචනය : ඔබට විකල්පයක් තිබේ නම් පාර්සර් එකක් භාවිතා කරන්න. ඒක කිව්වේ ...

HTML ටැග් ගැලපීමට මම (!) භාවිතා කරන රීජෙක්ස් මෙයයි:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

එය පරිපූර්ණ නොවිය හැක, නමුත් මම මෙම කේතය බොහෝ HTML හරහා ධාවනය කළෙමි . එය <a name="badgenerator"">වෙබයේ පෙන්වන වැනි අමුතු දේවල් පවා අල්ලා ගන්නා බව සලකන්න .

එය ස්වයං අන්තර්ගත ටැග් වලට නොගැලපෙන ලෙස මම අනුමාන කරමි, ඔබට එක්කෝ කෝබිගේ නිෂේධාත්මක පෙනුම පිටුපස භාවිතා කිරීමට අවශ්‍ය වනු ඇත :

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>

නැතිනම් එසේ නොවේ නම් ඒකාබද්ධ කරන්න.

ඩවුන්වෝටර්ස් වෙත: මෙය සත්‍ය නිෂ්පාදිතයකින් වැඩ කරන කේතයයි. මෙම පිටුව කියවන ඕනෑම කෙනෙකුට HTML හි රීජෙක්ස් භාවිතා කිරීම සමාජීය වශයෙන් පිළිගත හැකි යැයි හැඟීමක් ඇති වේ යැයි මම සැක කරමි.

Caveat : CDATA බ්ලොක්, අදහස්, සහ ස්ක්‍රිප්ට් සහ ස්ටයිල් අංග ඉදිරියේ මෙම රීජෙක්ස් තවමත් බිඳ වැටෙන බව මම සටහන් කළ යුතුය. ශුභාරංචිය නම්, ඔබට රීජෙක්ස් භාවිතා කරන්නන් ඉවත් කළ හැකිය ...


95
විශ්වීය වශයෙන් පරිපූර්ණ නොවීම ගැන හ ep ා වැලපෙනවාට වඩා බුද්ධිමත් දේවල් මත ක්‍රියා කරන දෙයක් සමඟ මම යන්නෙමි :-)
හ ep ා ප්‍රජීෂ් කුමාර්

55
HTML තුළ යමෙකු CDATA භාවිතා කරනවාද?
ඩැනුබියන් නැව

17
එබැවින් ඔබ ඇත්ත වශයෙන්ම රීජෙක්ස්පී සමඟ විග්‍රහ කිරීමේ ගැටළුව විසඳන්නේ නැත, නමුත් විග්‍රහයේ කොටසක් ලෙස මෙය ක්‍රියාත්මක විය හැකිය. PS: වැඩ කරන නිෂ්පාදනයේ හොඳ කේතයක් අදහස් නොවේ. වරදක් නැත, නමුත් කාර්මික වැඩසටහන් ක්‍රියාත්මක වන අතර ඔවුන්ගේ මුදල් ලබා ගන්නේ එලෙසයි
මිෂ්මාෂ්රු

32
ඔබගේ රීජෙක්ස් ආරම්භය හැකි කෙටිම, වලංගු HTML වලින් අසමත් වේ : <!doctype html><title><</title>. කළ යුතු සරල '<!doctype html><title><</title>'.match(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g)ප්‍රතිලාභ . ["<!doctype html>", "<title>", "<</title>"]["<title>", "</title>"]

2
අපි ලබා දී ඇති උදාහරණ සමඟ ගැලපීමට හා නොගැලපීමට උත්සාහ කරන්නේ නම්, /<.( Leisurerr]] Leisure>>]])? "foo"> <br /> <hr class = "foo" />'.match(/<.([^r>][^>]*)?>/g)
imma

506

පෘථිවිය වටකුරු බව ඔබට පවසන පුද්ගලයන් සිටිති (නැතහොත් අමුතු වචන භාවිතා කිරීමට අවශ්‍ය නම් පෘථිවිය ඕලෙට් ගෝලාකාරයක් විය හැකිය). ඔවුන් බොරු කියනවා.

නිත්‍ය ප්‍රකාශන පුනරාවර්තන නොවිය යුතු බව ඔබට පවසන පුද්ගලයින් සිටී. ඔවුන් ඔබව සීමා කරනවා. ඔවුන් ඔබව යටත් කර ගත යුතු අතර ඔවුන් එය කරන්නේ ඔබව නොදැනුවත්කමින් තබා ගැනීමෙනි.

ඔබට ඔවුන්ගේ යථාර්ථයේ ජීවත් වීමට හෝ රතු පෙති ගත හැකිය.

මාෂල් සාමිවරයා මෙන් (ඔහු මාෂල් .නෙට් පන්තියේ relative ාතියෙක් ද ?), මම ප්‍රතිලෝමව දැක ඇත්තෙමි පදනම් කරගත් -පදය ඔබට සිතාගත නොහැකි බල දැනුමෙන් ආපසු . ඔව්, මම හිතන්නේ පරණ එකක් හෝ දෙකක් ඔවුන්ව ආරක්ෂා කළා, නමුත් ඔවුන් රූපවාහිනියේ පාපන්දු නරඹමින් සිටියා, ඒ නිසා එය අපහසු නැහැ.

මම හිතන්නේ XML නඩුව තරමක් සරලයි. ඔබේ දුර්වල මනස තේරුම් ගැනීම පහසු කිරීම සඳහා පදනම් 64 හි විස්තාරණය කර කේතනය කර ඇති රෙජෙක්ස් (.නෙට් සින්ටැක්ස් හි) මේ වගේ දෙයක් විය යුතුය:

7L0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28
995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8itn6Po9/3eIue3+Px7/3F
86enJ8+/fHn64ujx7/t7vFuUd/Dx65fHJ6dHW9/7fd/t7fy+73Ye0v+f0v+Pv//JnTvureM3b169
OP7i9Ogyr5uiWt746u+BBqc/8dXx86PP7tzU9mfQ9tWrL18d3UGnW/z7nZ9htH/y9NXrsy9fvPjq
i5/46ss3p4z+x3e8b452f9/x93a2HxIkH44PpgeFyPD6lMAEHUdbcn8ffTP9fdTrz/8rBPCe05Iv
p9WsWF788Obl9MXJl0/PXnwONLozY747+t7x9k9l2z/4vv4kqo1//993+/vf2kC5HtwNcxXH4aOf
LRw2z9/v8WEz2LTZcpaV1TL/4c3h66ex2Xv95vjF0+PnX744PbrOm59ZVhso5UHYME/dfj768H7e
Yy5uQUydDAH9+/4eR11wHbqdfPnFF6cv3ogq/V23t++4z4620A13cSzd7O1s/77rpw+ePft916c7
O/jj2bNnT7e/t/397//M9+ibA/7s6ZNnz76PP0/kT2rz/Ts/s/0NArvziYxVEZWxbm93xsrUfnlm
rASN7Hf93u/97vvf+2Lx/e89L7+/FSXiz4Bkd/hF5mVq9Yik7fcncft9350QCu+efkr/P6BfntEv
z+iX9c4eBrFz7wEwpB9P+d9n9MfuM3yzt7Nzss0/nuJfbra3e4BvZFR7z07pj3s7O7uWJM8eCkme
nuCPp88MfW6kDeH7+26PSTX8vu+ePAAiO4LVp4zIPWC1t7O/8/+pMX3rzo2KhL7+8s23T1/RhP0e
vyvm8HbsdmPXYDVhtpdnAzJ1k1jeufOtUAM8ffP06Zcnb36fl6dPXh2f/F6nRvruyHfMd9rgJp0Y
gvsRx/6/ZUzfCtX4e5hTndGzp5jQo9e/z+s3p1/czAUMlts+P3tz+uo4tISd745uJxvb3/v4ZlWs
mrjfd9SG/swGPD/6+nh+9MF4brTBRmh1Tl5+9eT52ckt5oR0xldPzp7GR8pfuXf5PWJv4nJIwvbH
W3c+GY3vPvrs9zj8Xb/147/n7/b7/+52DD2gsSH8zGDvH9+i9/fu/PftTfTXYf5hB+9H7P1BeG52
MTtu4S2cTAjDizevv3ry+vSNb8N+3+/1po2anj4/hZsGt3TY4GmjYbEKDJ62/pHB+3/LmL62wdsU
1J18+eINzTJr3dMvXr75fX7m+MXvY9XxF2e/9+nTgPu2bgwh5U0f7u/74y9Pnh6/OX4PlA2UlwTn
xenJG8L996VhbP3++PCrV68QkrjveITxr2TIt+lL+f3k22fPn/6I6f/fMqZvqXN/K4Xps6sazUGZ
GeQlar49xEvajzI35VRevDl78/sc/b7f6jkG8Va/x52N4L9lBe/kZSh1hr9fPj19+ebbR4AifyuY
12efv5CgGh9TroR6Pj2l748iYxYgN8Z7pr0HzRLg66FnRvcjUft/45i+pRP08vTV6TOe2N/9jv37
R9P0/5YxbXQDeK5E9R12XdDA/4zop+/9Ht/65PtsDVlBBUqko986WsDoWqvbPD2gH/T01DAC1NVn
3/uZ0feZ+T77fd/GVMkA4KjeMcg6RcvQLRl8HyPaWVStdv17PwHV0bOB9xUh7rfMp5Zu3icBJp25
D6f0NhayHyfI3HXHY6YYCw7Pz17fEFhQKzS6ZWChrX+kUf7fMqavHViEPPKjCf1/y5hukcyPTvjP
mHQCppRDN4nbVFPaT8+ekpV5/TP8g/79mVPo77PT1/LL7/MzL7548+XvdfritflFY00fxIsvSQPS
mvctdYZpbt7vxKRfj3018OvC/hEf/79lTBvM3debWj+b8KO0wP+3OeM2aYHumuCAGonmCrxw9cVX
X1C2d4P+uSU7eoBUMzI3/f9udjbYl/el04dI7s8fan8dWRjm6gFx+NrKeFP+WX0CxBdPT58df/X8
DaWLX53+xFdnr06f/szv++NnX7x8fnb6NAhIwsbPkPS7iSUQAFETvP2Tx8+/Og0Xt/yBvDn9vd/c
etno8S+81QKXptq/ffzKZFZ+4e/743e8zxino+8RX37/k595h5/H28+y7fPv490hQdJ349E+txB3
zPZ5J/jsR8bs/y1j2hh/2fkayOqEmYcej0cXUWMN7QrqBwjDrVZRfyQM3xjj/EgYvo4wfLTZrnVS
ebdKq0XSZJvzajKQDUv1/P3NwbEP7cN5+Odivv9/ysPfhHfkOP6b9Fl+91v7LD9aCvp/+Zi+7lLQ
j0zwNzYFP+/Y6r1NcFeDbfBIo8rug3zS3/3WPumPlN3/y8f0I2X3cz4FP+/Y6htSdr2I42fEuSPX
/ewpL4e9/n1evzn94hb+Plpw2+dnbyh79zx0CsPvbq0lb+UQ/h7xvqPq/Gc24PnR18fzVrp8I57d
mehj7ebk5VdPnp+d3GJOSP189eTsaXyk/JV7l98j4SAZgRxtf7x155PR+O6jz36Pw9/1Wz/+e/5u
v//vbsfQAxobws8M9v7xLXp/785/395ED4nO1wx5fsTeH4LnRva+eYY8rpZUBFb/j/jfm8XAvfEj
4/b/ljF1F9B/jx5PhAkp1nu/+y3n+kdZp/93jWmjJ/M11TG++VEG6puZn593PPejoOyHMQU/79jq
GwrKfpSB+tmcwZ93XPkjZffDmIKfd2z1DSm7bmCoPPmjBNT74XkrVf71I/Sf6wTU7XJA4RB+lIC6
mW1+xN5GWw1/683C5rnj/m364cmr45Pf6/SN9H4Us4LISn355vjN2ZcvtDGT6fHvapJcMISmxc0K
MAD4IyP6/5Yx/SwkP360FvD1VTH191mURr/HUY+2P3I9boPnz7Ju/pHrcWPnP3I9/r/L3sN0v52z
0fEgNrgbL8/Evfh9fw/q5Xf93u/97vvf+2Lx/e89L7+/Fe3iZ37f34P5h178kTfx/5YxfUs8vY26
7/d4/OWbb5++ogn7PX5XzOHtOP3GrsHmqobOVO/8Hh1Gk/TPl198QS6w+rLb23fcZ0fMaTfjsv29
7Zul7me2v0FgRoYVURnf9nZEkDD+H2VDf8hjeq8xff1s6GbButNLacEtefHm9VdPXp++CRTw7/v9
r6vW8b9eJ0+/PIHzs1HHdyKE/x9L4Y+s2f+PJPX/1dbsJn3wrY6wiqv85vjVm9Pnp+DgN8efM5va
j794+eb36Xz3mAf5+58+f3r68s230dRvJcxKn/l//oh3f+7H9K2O0r05PXf85s2rH83f/1vGdAvd
w+qBFqsoWvzspozD77EpXYeZ7yzdfxy0ec+l+8e/8FbR84+Wd78xbvn/qQQMz/J7L++GPB7N0MQa
2vTMBwjDrVI0PxKGb4xxfiQMX0cYPuq/Fbx2C1sU8yEF+F34iNsx1xOGa9t6l/yX70uqmxu+qBGm
AxlxWwVS11O97ULqlsFIUvUnT4/fHIuL//3f9/t9J39Y9m8W/Tuc296yUeX/b0PiHwUeP1801Y8C
j/9vz9+PAo8f+Vq35Jb/n0rAz7Kv9aPA40fC8P+RMf3sC8PP08DjR1L3DXHoj6SuIz/CCghZNZb8
fb/Hf/2+37tjvuBY9vu3jmRvxNeGgQAuaAF6Pwj8/+e66M8/7rwpRNj6uVwXZRl52k0n3FVl95Q+
+fz0KSu73/dtkGDYdvZgSP5uskadrtViRKyal2IKAiQfiW+FI+tET/9/Txj9SFf8SFf8rOuKzagx
+r/vD34mUADO1P4/AQAA//8=

සැකසීමට ඇති විකල්පයන් වේ RegexOptions.ExplicitCapture . ඔබ සොයන අල්ලා ගැනීමේ කණ්ඩායම ELEMENTNAME. අල්ලා ගැනීමේ කණ්ඩායම ERRORහිස් නොවේ නම්, විග්‍රහ කිරීමේ දෝෂයක් ඇති වූ අතර රීජෙක්ස් නතර විය.

එය මිනිස් කියවිය හැකි රීජෙක්ස් වෙත නැවත හරවා යැවීමේදී ඔබට ගැටළු තිබේ නම්, මෙය උදව් විය යුතුය

static string FromBase64(string str)
{
    byte[] byteArray = Convert.FromBase64String(str);

    using (var msIn = new MemoryStream(byteArray))
    using (var msOut = new MemoryStream()) {
        using (var ds = new DeflateStream(msIn, CompressionMode.Decompress)) {
            ds.CopyTo(msOut);
        }

        return Encoding.UTF8.GetString(msOut.ToArray());
    }
}

ඔබට සැක සහිත නම්, නැත, මම විහිළුවක් නොකරමි (නමුත් සමහර විට මම බොරු කියමි). එය ක්‍රියාත්මක වනු ඇත. එය පරීක්ෂා කිරීම සඳහා මම ඒකක පරීක්ෂණ ටොන් ගණනක් ගොඩනගා ඇති අතර, අනුකූලතා පරීක්ෂණ පවා (කොටසක්) භාවිතා කර ඇත . එය ටෝකනයිසර් එකක් මිස අංගසම්පූර්ණ පාර්සලයක් නොවේ, එබැවින් එය එක්ස්එම්එල් එහි සංරචක ටෝකන වලට පමණක් බෙදනු ඇත. එය ඩීටීඩී විග්‍රහ නොකරයි / ඒකාබද්ධ නොකරයි.

ඔහ් ... ඔබට රීජෙක්ස් හි ප්‍රභව කේතය අවශ්‍ය නම්, සහායක ක්‍රම කිහිපයක් සමඟ:

xml හෝ සම්පූර්ණ සරල රීජෙක්ස් ටෝකනකරණය කිරීමට regex


69
යහපත් ස්වාමීනි, එය අති විශාලය. මගේ ලොකුම ප්‍රශ්නය වන්නේ ඇයි? සියලුම නවීන භාෂාවලට එක්ස්එම්එල් පාර්සර් ඇති බව ඔබට වැටහෙනවා නේද? ඔබට පේළි 3 ක් වැනි සියල්ල කළ හැකි අතර එය ක්‍රියාත්මක වන බවට වග බලා ගන්න. තවද, පිරිසිදු රීජෙක්ස් වලට සමහර දේවල් කිරීමට හැකියාවක් නොමැති බව ඔබ වටහාගෙන තිබේද? ඔබ දෙමුහුන් රීජෙක්ස් / අත්‍යවශ්‍ය කේත විග්‍රහයක් නිර්මාණය කර නොමැති නම්, නමුත් එය ඔබට ඇති බවක් නොපෙනේ. ඔබට අහඹු දත්ත සම්පීඩනය කළ හැකිද?
ජස්ටින් මෝගන්

114
ජස්ටින් මට හේතුවක් අවශ්‍ය නැහැ. එය කළ හැකිය (එය නීති විරෝධී / දුරාචාරමය නොවේ), එබැවින් මම එය කර ඇත්තෙමි. අප පිළිගන්නා (නැපෝලියන් හිල්) හැර මනසට සීමාවන් නොමැත ... නූතන භාෂාවන්ට XML විග්‍රහ කළ හැකිද? ඇත්තටම? මම හිතුවා ඒක නීති විරෝධී කියලා! :-)
xanatos

76
සර්, මට විශ්වාසයි. මගේ සදාකාලික චලන යන්ත්‍රය සඳහා මම මෙම කේතය කර්නලයේ කොටසක් ලෙස භාවිතා කරන්නෙමි - පේටන්ට් කාර්යාලයේ සිටින මෝඩයන් මගේ අයදුම්පත ප්‍රතික්ෂේප කරමින් සිටින බව විශ්වාස කළ හැකිද? හොඳයි, මම ඔවුන්ට පෙන්වන්නම්. මම ඒවා සියල්ලම පෙන්වන්නම්!
ජස්ටින් මෝගන්

31
Ust ජස්ටින් ඉතින් එක්ස්එම්එල් පාර්සර් එකක් අර්ථ දැක්වීම අනුව දෝෂ රහිත වන අතර රෙජෙක්ස් නොවේද? මක්නිසාද යත් එක්ස්එම්එල් පාර්සර් නිර්වචනය අනුව දෝෂ රහිත නම් එය බිඳ වැටෙන එක්ස්එම්එල් එකක් තිබිය හැකි අතර අපි නැවත පියවර 0 වෙත යමු. මෙය කියමු: එක්ස්එම්එල් පාර්සර් සහ මෙම රීජෙක්ස් යන දෙකම "නීතිමය" විග්‍රහ කිරීමට උත්සාහ කරයි. "XML. ඔවුන්ට සමහර “නීති විරෝධී” XML විග්‍රහ කළ හැකිය. දෝෂ වලට ඔවුන් දෙදෙනාම බිඳ වැටිය හැකිය. C # XmlReader නිසැකවම මෙම Regex වලට වඩා පරීක්ෂා කර ඇත.
xanatos

31
නැත, කිසිවක් දෝෂ රහිත ය: 1) සියලුම වැඩසටහන් වල අවම වශයෙන් එක් දෝෂයක්වත් අඩංගු වේ. 2) සියලුම වැඩසටහන් වල අවම වශයෙන් එක් පේළියක්වත් අනවශ්‍ය ප්‍රභව කේතයක් අඩංගු වේ. 3) # 1 සහ # 2 වන විට සහ තාර්කික ප්‍රේරණය භාවිතා කිරීමෙන්, ඕනෑම වැඩසටහනක් දෝෂයක් සහිත තනි කේත පේළියකට අඩු කළ හැකි බව ඔප්පු කිරීම සරල කාරණයකි. (ඉගෙනීමේ පර්ල් වෙතින්)
ස්කොට් වීවර්

301

කවචයේදී, ඔබට sed භාවිතා කර HTML විග්‍රහ කළ හැකිය :

  1. Turing.sed
  2. HTML විග්‍රහකය ලියන්න (ගෙදර වැඩ)
  3. ???
  4. ලාභයක්!

ආශ්‍රිත (ඔබ රීජෙක්ස් ගැලපුම භාවිතා නොකළ යුත්තේ ඇයි):


3
මට බයයි ඔයාට විහිළුව ලැබුණේ නැහැ, @kenorb. කරුණාකර, ප්‍රශ්නය සහ පිළිගත් පිළිතුර නැවත වරක් කියවන්න. මෙය පොදුවේ HTML විග්‍රහ කිරීමේ මෙවලම් ගැන හෝ HTML විග්‍රහ කිරීමේ ෂෙල් මෙවලම් ගැන නොවේ, එය රීජෙක්ස් හරහා HTML විග්‍රහ කිරීම ගැන ය.
පැලේක්

1
නැත, b අබ්දුල්. එය සම්පූර්ණයෙන්ම, ඔප්පු කළ හැකි (ගණිතමය අර්ථයෙන්) කළ නොහැකි ය.
පලෙක්

4
ඔව්, එම පිළිතුර එය හොඳින් සාරාංශ කරයි, b අබ්දුල්. කෙසේ වෙතත්, රීජෙක්ස් ක්‍රියාත්මක කිරීම ඇත්ත වශයෙන්ම ගණිතමය අර්ථයෙන් නිත්‍ය ප්‍රකාශන නොවන බව සලකන්න - ඒවා ශක්තිමත් කරන, බොහෝ විට ටියුරින්-සම්පූර්ණ (ව්‍යාකරණ 0 වර්ගයට සමාන) වන ව්‍යුහයන් ඇත. මෙම කාරණය සමඟ තර්කය බිඳී ගියද, රීජෙක්ස් කිසි විටෙකත් එවැනි කාර්යයක් කිරීමට හැකියාවක් නොමැති බව අර්ථයෙන් තරමක් වලංගු වේ.
පලෙක්

2
මාර්ගය වන විට, මම සඳහන් කළ විහිළුව නම් කෙනෝර්බ්ගේ (රැඩිකල්) සංස්කරණයන්ට පෙර මෙම පිළිතුරේ අන්තර්ගතය, විශේෂයෙන් සංශෝධනය 4, b අබ්දුල්.
පලෙක්

3
හාස්‍යජනක දෙය නම් OP කිසි විටෙකත් රීජෙක්ස් භාවිතයෙන් html විග්‍රහ කිරීමට ඉල්ලා නොසිටීමයි. රීජෙක්ස් භාවිතයෙන් පෙළ (එය HTML ලෙස) ගැලපෙන ලෙස ඔහු ඉල්ලා සිටියේය. එය සම්පූර්ණයෙන්ම සාධාරණයි.
පරලයිෆ්

275

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 &gt;ul&lt;, 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 &gt;ul&lt;, 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 &gt;ul&lt;, oh my!</li>                         <li>...</li>                    </ul>               </div>           </li>        </ul>

අවසාන වශයෙන්, ජෙෆ් ඇට්වුඩ්ගේ ලිපිය: Parsing Html The Cthulhu Way . විනෝදජනක ලෙස, එය දැනට ඡන්ද 4k ඉක්මවා ඇති මෙම ප්‍රශ්නයට පිළිතුර උපුටා දක්වයි.


18
System.TextC # හි කොටසක් නොවේ. එය .NET හි කොටසකි.
ජෝන් සෝන්ඩර්ස්

8
ඔබේ රීජෙක්ස් ( (?=<ul\s*id="matchMe"\s*type="square"\s*>) # match start with <ul id="matchMe"...) හි පළමු පේළියේ , "<ul" සහ "id" අතර විය යුතුය \s+, \s*එය ඔබට අවශ්‍ය නම් මිස <ulid = ...;) විය යුතුය
C0deH4cker

0 C0deH4cker ඔබ නිවැරදියි, ප්‍රකාශනය \s+වෙනුවට තිබිය යුතුය \s*.
සෑම්

4
මම එය සැබවින්ම වටහාගෙන ඇති බවක් නොවේ, නමුත් මම සිතන්නේ ඔබේ රීජෙක්ස් අසමත් වේ<img src="images/pic.jpg" />
Scheintod

3
CheScheintod අදහස් දැක්වීමට ස්තූතියි. මම කේතය යාවත්කාලීන කළා. /ඔබගේ <img src="images/pic.jpg" />html සඳහා අසමත් වූ ඇතුළත කොතැනක හෝ ඇති ස්වයං වසා දැමීමේ ටැග් සඳහා පෙර ප්‍රකාශනය අසමත් විය .
සෑම්

258

PHP හි XML සහ HTML විග්‍රහ කිරීම සඳහා QueryPath භාවිතා කිරීමට මම යෝජනා කරමි . එය මූලික වශයෙන් jQuery හා සමාන වාක්‍ය ඛණ්ඩයකි, එය සේවාදායක පැත්තේ පමණි.


8
@ කයිල් - jQuery එක්ස්එම්එල් විග්‍රහ නොකරයි, එය සේවාදායකයාගේ බිල්ට් පාර්සර් භාවිතා කරයි (එකක් තිබේ නම්). එබැවින් ඔබට එය කිරීමට jQuery අවශ්‍ය නැත, නමුත් පැරණි ජාවාස්ක්‍රිප්ට් පේළි දෙකක් තරම් කුඩාය . බිල්ට්-පාර්සර් නොමැති නම්, jQuery උදව් නොකරයි.
රොබ්

1
ObRobG ඇත්ත වශයෙන්ම jQuery භාවිතා කරන්නේ DOM මිස සාදන ලද විග්‍රහකය නොවේ.
Qix - MONICA WAS MISTREATED

11
@ Qix then එවිට ඔබ ලේඛනයේ කතුවරුන්ට පැවසීම වඩා හොඳය: " jQuery.parseXML බ්‍රව්සරයේ ස්වදේශීය විග්‍රහ කිරීමේ කාර්යය භාවිතා කරයි ... ". මුලාශ්‍රය: jQuery.parseXML ()
RobG

6
මතක ප්‍රශ්නයෙන් ( meta.stackexchange.com/questions/19478/the-many-memes-of-meta/… ) මෙහි පැමිණ ඇති මම එයට පිළිතුරු සපයන්නේ 'jQuery භාවිතා කරන්න'
Jorn

221

ඔබට HTML රීජෙක්ස් සමඟ විග්‍රහ කළ නොහැකි පිළිතුරු නිවැරදි වුවත් ඒවා මෙහි අදාළ නොවේ. OP ට අවශ්‍ය වන්නේ එක් HTML ටැගයක් රීජෙක්ස් සමඟ විග්‍රහ කිරීමට වන අතර එය සාමාන්‍ය ප්‍රකාශනයකින් කළ හැකි දෙයකි.

යෝජිත රීජෙක්ස් වැරදියි, නමුත්:

<([a-z]+) *[^/]*?>

ඔබ රීජෙක්ස් වෙත යමක් එකතු කරන්නේ නම්, පසුපසට යාමෙන් එය මෝඩ දේවල් සමඟ සැසඳීමට බල කළ හැකිය <a >>, [^/]එය අවසර ඇත. <space>*[^/]*අතිරික්තයක් ඇති බව සලකන්න , මන්දයත් [^/]*අවකාශයට ගැලපේ.

මගේ යෝජනාව වනු ඇත

<([a-z]+)[^>]*(?<!/)>

කොහෙද (?<! ... )(පර්ල් රිජෙක්ස් වල) the ණාත්මක පෙනුම පිටුපස . එහි "a <, පසුව වචනයක්, පසුව a> නොවන ඕනෑම දෙයක්, අන්තිමයා a / නොවිය හැක, පසුව>" යනුවෙන් එය කියවේ.

මෙය <a/ >(මුල් රීජෙක්ස් වැනි) වැනි දේවලට ඉඩ දෙන බව සලකන්න , එබැවින් ඔබට වඩා සීමිත යමක් අවශ්‍ය නම්, අවකාශයන්ගෙන් වෙන් කරන ලද ගුණාංග යුගලවලට ගැලපෙන පරිදි ඔබ රීජෙක්ස් එකක් සෑදිය යුතුය.


29
ප්‍රශ්නය සම්පූර්ණ (X) HTML විග්‍රහ කිරීම ගැන නොවන බව සඳහන් කිරීම සඳහා, එය ගැලපීම (X) HTML විවෘත ටැග් ගැන ය.
LarsH

10
බොහෝ පිළිතුරු නොසලකා හැර ඇති බවක් පෙනේ, HTML විග්‍රහකයෙකුට HTML හි කොටස් සඳහා එය ක්‍රියාවට නැංවීමේදී නිත්‍ය ප්‍රකාශන භාවිතා කළ හැකි අතර බොහෝ විග්‍රහ කරන්නන් මෙය නොකළේ නම් මම පුදුම වෙමි.
තායින්

Ha තායින් හරියටම. තනි ටැග් විග්‍රහ කිරීමේදී, කාර්යය සඳහා නිවැරදි මෙවලම නිත්‍ය ප්‍රකාශනයකි. සාධාරණ පිළිතුරක් සොයා ගැනීම සඳහා යමෙකු පිටුවෙන් අඩක් අනුචලනය කිරීම හාස්‍යයට කරුණකි. පිළිගත් පිළිතුර වැරදියි, මන්ද එය ලීසිං හා විග්‍රහ කිරීම මිශ්‍ර කරයි.
kasperd

3
ආරෝපණ අගයක '>' හෝ '/' අක්ෂරයක් ඇති විට මෙහි දී ඇති පිළිතුර අසමත් වේ.
මාටින් එල්

1
අදහස් හෝ සීඩීටා කොටස් අඩංගු HTML මත මෙය වැරදි ලෙස ක්‍රියා කරයි. උපුටා ගත් ගුණාංගයක >අක්ෂරයක් තිබේ නම් එය නිවැරදිව ක්‍රියා නොකරනු ඇත. OP යෝජනා කරන දේ රීජෙක්ස් එකකින් කළ හැකි බව මම එකඟ වෙමි , නමුත් මෙහි ඉදිරිපත් කර ඇති දෙය සරල කළ නොහැකි ය.
ජැක් බී

183

උත්සාහ කරන්න:

<([^\s]+)(\s[^>]*?)?(?<!/)>

එය ඔබට සමාන ය, නමුත් අන්තිමයා >කප්පාදුවකින් පසුව නොවිය යුතු අතර එය ද පිළිගනී h1.


108
<a href="foo" title="5> 3 "> </a> අයියෝ
ගැරත්

21
එය ඉතා සත්‍යයකි, මම ඒ ගැන සිතුවෙමි, නමුත් මම සිතුවේ >සංකේතය නිසියාකාරව ගැලවී ඇති බවයි & gt;.
කෝබි

66
>ගුණාංග අගයකින් වලංගු වේ. ඇත්ත වශයෙන්ම, 'කැනොනිකල් එක්ස්එම්එල්' අනුක්‍රමිකකරණයේදී ඔබ භාවිතා නොකළ යුතුය &gt;. ( >ගුණාංගයක වටිනාකම කිසිසේත්ම අසාමාන්‍ය දෙයක් නොවන බව අවධාරණය කිරීම හැර, එය සම්පූර්ණයෙන්ම අදාළ නොවේ.)
බොබින්ස්

5
Ob කොබී: රීජෙක්ස් එකක දී උච්චාරණ සලකුණ (ඔබ අවසානය දක්වා තැබූ සලකුණ) අදහස් කරන්නේ කුමක්ද?
මාකෝ ඩෙමියෝ

6
ob බොබින්ස්: ඔබට විශ්වාසද? මට තවදුරටත් තේරෙන්නේ නැත, එබැවින් මෙම වලංගු HTML ද වේ:<div title="this tag is a <div></div>">hello</div>
මාකෝ ඩෙමියෝ

179

පුරාණ චීන මූලෝපාය ist යෙකු, සාමාන්‍ය හා දාර්ශනිකයෙකු වන සන් ට්සු මෙසේ පැවසීය.

ඔබ ඔබේ සතුරන් හඳුනන්නේ නම් සහ ඔබ ඔබම හඳුනන්නේ නම්, ඔබට එකදු පරාජයකින් තොරව සටන් සියයක් දිනා ගත හැකිය. ඔබ ඔබ ගැන පමණක් දන්නවා නම්, නමුත් ඔබේ ප්‍රතිවාදියා නොවේ නම්, ඔබට ජයග්‍රහණය හෝ පරාජය විය හැකිය. ඔබ හෝ ඔබේ සතුරා ගැන ඔබ නොදන්නේ නම්, ඔබ සැමවිටම ඔබටම අනතුරක් වනු ඇත.

මෙම අවස්ථාවේදී ඔබේ සතුරා HTML වන අතර ඔබ ඔබම හෝ රීජෙක්ස් වේ. ඔබ අක්‍රමවත් රීජෙක්ස් සහිත පර්ල් විය හැකිය. HTML දැන ගන්න. ඔබ ගැන දැනගන්න.

මම HTML වල ස්වභාවය විස්තර කරන හයිකු රචනා කර ඇත්තෙමි.

HTML has
complexity exceeding
regular language.

පර්ල් හි රීජෙක්ස් වල ස්වභාවය විස්තර කරන හයිකු ද මම රචනා කර ඇත්තෙමි.

The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>

153
<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');

$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}

ප්‍රතිදානය:

string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"

මූලිකවම ස්වයං වසා දැමීමේ මූලද්‍රව්‍ය නෝඩ් නම් නිර්වචනය කරන්න, මුළු HTML නූලම DOM පුස්තකාලයකට පටවන්න, සියලු අංග අල්ලාගෙන, ස්වයං වසා දැමීමක් නොමැති ඒවා පෙරළා පෙරහන් කර ඒවා ක්‍රියාත්මක කරන්න.

මට විශ්වාසයි ඔබ මේ වන විටත් රීජෙක්ස් භාවිතා නොකළ යුතු බව ඔබ දැනටමත් දන්නා බව.


1
ඔබ සැබෑ XHTML සමඟ ගනුදෙනු කරන්නේ නම් getElementsByTagName සමඟ එකතු NSකර නාම අවකාශය සඳහන් කරන්න.
meder omuraliev

148

මේ සඳහා ඔබගේ නිශ්චිත අවශ්‍යතාවය මම නොදනිමි, නමුත් ඔබත් .NET භාවිතා කරන්නේ නම්, ඔබට Html Agility Pack භාවිතා කළ නොහැකිද?

උපුටා ගැනීම:

එය .NET කේත පුස්තකාලයක් වන අතර එය "වෙබයෙන් පිටත" HTML ගොනු විග්‍රහ කිරීමට ඉඩ ලබා දේ. "සැබෑ ලෝකය" විකෘති HTML සමඟ විග්‍රහ කරන්නා ඉතා ඉවසිලිවන්තය.


137

ඔබට අවශ්‍ය වන්නේ පළමුවැන්න >/. එය කරන්නේ කෙසේද යන්න පිළිබඳ විස්තර සඳහා මෙහි බලන්න . එය negative ණාත්මක පෙනුමක් ලෙස හැඳින්වේ.

කෙසේ වෙතත්, එය බොළඳ ලෙස ක්‍රියාත්මක කිරීම <bar/></foo>මෙම උදාහරණ ලේඛනයට ගැලපේ

<foo><bar/></foo>

ඔබ විසඳීමට උත්සාහ කරන ගැටලුව පිළිබඳ වැඩි විස්තර ලබා දිය හැකිද? ඔබ ක්‍රමානුකූලව ටැග් හරහා නැවත කියවනවාද?


1
ඔව්, මට විශ්වාසයි. දැනට විවෘතව ඇති සියලුම ටැග්ස් තීරණය කිරීම, පසුව එය සංවෘත ටැග් සමඟ වෙනම අරාවකින් සංසන්දනය කරන්න. රෙජෙක්ස් මගේ මොළයට රිදෙනවා.
ජෙෆ්

122

W3C ව්‍යාජ රීජෙක්ස් ස්වරූපයෙන් විග්‍රහ කිරීම පැහැදිලි කරයි:
W3C සබැඳිය

සඳහා var සබැඳි අනුගමනය QName, Sසහ Attributeපැහැදිලි චිත්රයක් ලබා ගැනීමට.
ඒ මත පදනම්ව ඔබට ටැග් ඉවත් කිරීම වැනි දේවල් හැසිරවීමට හොඳ රීජෙක්ස් එකක් සෑදිය හැකිය.


5
මෙහි සඳහන් කර ඇති පරිදි එය psuedo regexp පෝරමයක් නොවේ, එය EBNF ආකෘතියකි: XML spec, උපග්‍රන්ථය 6
Rob G

106

ඔබට මෙය PHP සඳහා අවශ්‍ය නම්:

මෙම PHP DOM කාර්යයන් එය නිසි XML ආකෘතිකරණය මිස නිසි ක්රියා නොකරනු ඇත. ඔවුන්ගේ භාවිතය අනෙක් මිනිස් සංහතිය සඳහා කොතරම් හොඳ වුවත්.

simplehtmldom හොඳයි, නමුත් මම එය ටිකක් දෝෂ සහිත බව දුටුවෙමි, එය තරමක් මතකය බරයි [විශාල පිටුවල බිඳ .]

මම කිසි විටෙක විමසුම් මාර්ග භාවිතා කර නැත , එබැවින් එහි ප්‍රයෝජනය ගැන අදහස් දැක්විය නොහැක.

උත්සාහ කළ යුතු තවත් එකක් වන්නේ මගේ ඩොම්පාර්සර් ය . එය සම්පත් පිළිබඳ ඉතා සැහැල්ලු ය. මම ටික කලක් සතුටින් භාවිතා කරමි. ඉගෙනීමට සරල සහ බලවත්.

පයිතන් සහ ජාවා සඳහා සමාන සබැඳි පළ කරන ලදී.

පහළට යන අය සඳහා - මම මගේ පන්තිය ලිව්වේ එක්ස්එම්එල් විග්‍රහ කරන්නන්ට සැබෑ භාවිතයට ඔරොත්තු දිය නොහැකි බව ඔප්පු වූ විට පමණි. ආගමික පහත් කොට සැලකීම ප්‍රයෝජනවත් පිළිතුරු පළ කිරීමෙන් වළක්වයි - කරුණාකර කාරණයේ ඉදිරිදර්ශනය තුළ දේවල් තබා ගන්න.


95

මෙන්න විසඳුම:

<?php
// here's the pattern:
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*(\/>|>)/';

// a string to parse:
$string = 'Hello, try clicking <a href="#paragraph">here</a>
    <br/>and check out.<hr />
    <h2>title</h2>
    <a name ="paragraph" rel= "I\'m an anchor"></a>
    Fine, <span title=\'highlight the "punch"\'>thanks<span>.
    <div class = "clear"></div>
    <br>';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>

එය ගැඹුරින් පරීක්ෂා කිරීම සඳහා, මම ස්වයංක්‍රීයව වැසෙන ටැග් වලට ඇතුළත් කළෙමි:

  1. <hr />
  2. <br/>
  3. <br>

මම සමඟ ටැග් ද ඇතුළත් කළෙමි:

  1. එක් ලක්ෂණයක්
  2. එක් ගුණාංගයකට වඩා
  3. කුමන අගය තනි උපුටා දැක්වීම්වලට හෝ ද්විත්ව උපුටා දැක්වීම් වලට බැඳී තිබේද?
  4. පරිසීමකය ද්විත්ව උපුටා දැක්වීමක් වන අතර අනෙක් අතට තනි උපුටා දැක්වීම් අඩංගු ගුණාංග
  5. "අවිනිශ්චිත" ගුණාංගය "=" සංකේතයට පෙර, ඊට පසුව සහ ඊට පෙර සහ පසුව අවකාශයක් සමඟ ආරෝපණය කරයි.

ඉහත සංකල්පය සනාථ කිරීම සඳහා ක්‍රියා නොකරන යමක් ඔබ සොයා ගන්නේ නම්, මගේ කුසලතා වැඩි දියුණු කිරීම සඳහා කේතය විශ්ලේෂණය කිරීමේදී මට හැකිය.

<EDIT> පරිශීලකයාගේ ප්‍රශ්නය ස්වයං-වැසීමේ ටැග් විග්‍රහ කිරීමෙන් වැළකී සිටීම බව මට අමතක විය. මෙම අවස්ථාවේ දී රටාව වඩාත් සරල ය, මෙය බවට හැරවීම:

$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';

@Ridgerunner පරිශීලකයා දුටුවේ රටාව මඟින් වටිනාකමක් නැති ගුණාංග හෝ ගුණාංග වලට ඉඩ නොදෙන බවයි. මෙම අවස්ථාවේ දී කදිම සුසර කිරීමක් අපට පහත රටාව ගෙන එයි:

$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';

</EDIT>

රටාව තේරුම් ගැනීම

රටාව ගැන වැඩිදුර ඉගෙන ගැනීමට යමෙකු උනන්දු වන්නේ නම්, මම යම් රේඛාවක් සපයමි:

  1. පළමු උප ප්‍රකාශනය (\ w +) ටැග් නාමයට ගැලපේ
  2. දෙවන උප ප්‍රකාශනයේ ගුණාංගයක රටාව අඩංගු වේ. එය රචනා කර ඇත්තේ:
    1. හිස් අවකාශ එකක් හෝ කිහිපයක් \ s +
    2. ගුණාංගයේ නම (\ w +)
    3. හිස් අවකාශය ශුන්‍ය හෝ වැඩි ගණනක් * s * (එය කළ හැකි හෝ නැත, මෙහි හිස් තැන් තබයි)
    4. "=" සංකේතය
    5. නැවතත්, හිස් අවකාශය ශුන්‍ය හෝ වැඩි ගණනක්
    6. ආරෝපණ අගයේ පරිසීමකය, තනි හෝ ද්විත්ව උපුටා දැක්වීමක් ('| ") නැවතත් ගුණාංගය වැසීම විග්‍රහ කිරීමට, එය ඉතා වැදගත් වන්නේ එබැවිනි.
    7. සම්පාත, ආරෝපණය වටිනාකම පාහේ දෙයක්: (.? *); මෙම විශේෂිත වාක්‍ය ඛණ්ඩය තුළ , කෑදර ගැලපීම (තරු ලකුණු කිරීමෙන් පසු ප්‍රශ්නාර්ථ ලකුණ) භාවිතා කරමින් රෙජීඑක්ස් එන්ජිම “ඉදිරි-පෙනුමට සමාන” ක්‍රියාකරුවෙකු සක්‍රීය කරයි.
    8. මෙහි විනෝදය පැමිණේ: re 4 කොටස පසුගාමී ක්‍රියාකරු වේ වන අතර එය රටාවට පෙර අර්ථ දක්වා ඇති උප ප්‍රකාශනයක් ගැන සඳහන් කරයි, මේ අවස්ථාවේ දී, මම සඳහන් කරන්නේ සිව්වන උප ප්‍රකාශනය වන අතර එය සොයාගත් පළමු ගුණාංග පරිසීමකය වේ
    9. හිස් අවකාශය ශුන්‍ය හෝ වැඩි ගණනක් \ s *
    10. උප-ප්‍රකාශනය මෙහි අවසන් වන්නේ, තරු ලකුණු මඟින් ලබා දෙන ශුන්‍ය හෝ වැඩි සිදුවීම් පිරිවිතර සමඟ ය.
  3. ටැගයක් ">" සංකේතයට පෙර සුදු අවකාශයකින් අවසන් විය හැකි බැවින්, ශුන්‍ය හෝ වැඩි හිස් අවකාශයක් \ s * උප රටාව සමඟ ගැලපේ.
  4. ගැලපෙන ටැගය සරල ">" සංකේතයකින් හෝ විය හැකි XHTML වසා දැමීමකින් අවසන් විය හැකිය, එමඟින් ඊට පෙර කප්පාදුව භාවිතා කරයි: (/> |>). කප්පාදුව ඇත්ත වශයෙන්ම, නිත්‍ය ප්‍රකාශන පරිසීමකය සමඟ සමපාත වන බැවින් පැන ගොස් ඇත.

කුඩා ඉඟිය: මෙම කේතය වඩා හොඳින් විශ්ලේෂණය කිරීම සඳහා මම HTML විශේෂ අක්ෂර වලින් ගැලවී නොයන බැවින් ජනනය කරන ලද ප්‍රභව කේතය දෙස බැලීම අවශ්‍ය වේ.


12
කිසිදු වටිනාකමක් නැති ගුණාංග ඇති වලංගු ටැග් වලට නොගැලපේ, එනම් <option selected>. වලංගු නොවන ටැගයන් නම් නොකළ ගුණාංග අගයන් සමඟ නොගැලපේ, එනම් <p id=10>.
ridgerunner

1
@ridgerunner: ඔබගේ අදහස් දැක්වීමට බොහොම ස්තූතියි. එවැනි අවස්ථාවක රටාව ටිකක් වෙනස් විය යුතුය: $ pattern = '/ <(\ w +) (\ s + (\ w +) (\ s * \ = \ s * (\' | "|) (. *?) \\ 5 \ s *)?) * \ S *> / '; මම එය පරීක්‍ෂා කර, උපුටා නොගත් ගුණාංග හෝ වටිනාකමක් නැති ගුණාංග සම්බන්ධයෙන් ක්‍රියා කරමි.
එමානුවෙල් ඩෙල් ග්‍රෑන්ඩ්

ටැග් නමට පෙර අවකාශයක් ගැන කෙසේද: < a href="http://wtf.org" >එය නීත්‍යානුකූල බව මට හොඳටම විශ්වාසයි, නමුත් ඔබ එයට නොගැලපේ.
ෆ්ලොරිස්

7
කණගාටුයි, ටැග් නාමයකට පෙර සුදු අවකාශය නීති විරෝධී ය. “හොඳටම විශ්වාසයි” යන්නෙන් ඔබ්බට ඔබ ඔබේ විරෝධයට සාක්ෂි ඉදිරිපත් නොකරන්නේ ඇයි? XML 1.1 වෙත යොමු කර ඇති මගේ, w3.org/TR/xml11/#sec-starttags මෙන්න , ඔබට HTML 4, 5 සහ XHTML සඳහාද එයම සොයාගත හැකිය, මන්ද ඔබ පරීක්ෂණයක් කළහොත් W3C වලංගු භාවයක් ද අනතුරු අඟවනු ඇත. මෙහි සිටින තවත් බොහෝ බ්ලා-බ්ලා-කවියන් වශයෙන්, ප්‍රශ්නයේ නිශ්චිතව දක්වා ඇති කොන්ත්‍රාත් නීතිරීතිවලට අනුකූලව මගේ කේතය අසමත් වන්නේ කොතැනද යන්න නිරූපණය කිරීම සඳහා මගේ පිළිතුරුවලට us ණ සිය ගණනක් හැරුණු විට මට තවමත් බුද්ධිමත් තර්කයක් ලැබුණේ නැත . මම ඔවුන්ව පිළිගන්නවා.
එමානුවෙල් ඩෙල් ග්‍රෑන්ඩ්

@ridgerunner ඇත්ත වශයෙන්ම ඔබේ අදහස බුද්ධිමත් හා පිළිගැනීමට ලක් විය.
එමානුවෙල් ඩෙල් ග්‍රෑන්ඩ්

91

මට HTML ලේඛනයකින් යමක් ඉක්මණින් උකහා ගැනීමට අවශ්‍ය වූ විට, මම එය XML බවට පරිවර්තනය කිරීමට ටයිඩි භාවිතා කර පසුව XPath හෝ XSLT භාවිතා කර මට අවශ්‍ය දේ ලබා ගනිමි. ඔබේ නඩුවේදී, මේ වගේ දෙයක්:

//p/a[@href='foo']

89

මම මීට පෙර HTMLParser නමින් විවෘත කේත මෙවලමක් භාවිතා කළෙමි . එය HTML විවිධාකාරයෙන් විග්‍රහ කිරීම සඳහා නිර්මාණය කර ඇති අතර අරමුණ හොඳින් ඉටු කරයි. එයට HTML විවිධ ට්‍රයිනෝඩ් ලෙස විග්‍රහ කළ හැකි අතර ඔබට පහසුවෙන් එහි API භාවිතා කර ගුණාංගය නෝඩ් එකෙන් ලබා ගත හැකිය. එය පරීක්ෂා කර බලා මෙය ඔබට උදව් කළ හැකිදැයි බලන්න.


83

සාමාන්‍ය ප්‍රකාශන සමඟ HTML විග්‍රහ කිරීමට මම කැමතියි. හිතාමතාම කැඩී ඇති මෝඩ HTML විග්‍රහ කිරීමට මම උත්සාහ නොකරමි. මෙම කේතය මගේ ප්‍රධාන විග්‍රහකයයි (පර්ල් සංස්කරණය):

$_ = join "",<STDIN>; tr/\n\r \t/ /s; s/</\n</g; s/>/>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print

එය htmlsplit ලෙස හැඳින්වේ, HTML එක පේළි වලට බෙදයි, එක් එක් පේළියේ එක් ටැගයක් හෝ පෙළ කැබැල්ලක් ඇත. ග්‍රෙප් , සෙඩ් , පර්ල් වැනි වෙනත් පෙළ මෙවලම් සහ ස්ක්‍රිප්ට් සමඟ රේඛා තවදුරටත් සැකසිය හැක . මම විහිළුවක්වත් නොකරමි :) විනෝද වන්න.

ඔබට අතිවිශාල වෙබ් පිටු සැකසීමට අවශ්‍ය නම්, මගේ මුඩුක්කු සියල්ල-පළමු පර්ල් පිටපත ලස්සන ප්‍රවාහයක් බවට පත් කිරීමට තරම් සරල ය. නමුත් එය ඇත්ත වශයෙන්ම අවශ්ය නොවේ.

මම හිතනවා මම මේ සඳහා පහත් කොට සලකනු ඇත.

HTML බෙදීම


මගේ අපේක්ෂාවට එරෙහිව මෙය ඉහළ නැංවීමක් ලබා ඇත, එබැවින් මම වඩා හොඳ නිත්‍ය ප්‍රකාශන කිහිපයක් යෝජනා කරමි:

/(<.*?>|[^<]+)\s*/g    # get tags and text
/(\w+)="(.*?)"/g       # get attibutes

ඒවා XML / XHTML සඳහා හොඳයි.

සුළු වෙනස්කම් සහිතව, එය අවුල් සහගත HTML සමඟ සාර්ථකව කටයුතු කළ හැකිය ... නැතහොත් පළමුව HTML -> XHTML පරිවර්තනය කළ හැකිය.


නිත්‍ය ප්‍රකාශන ලිවීමට ඇති හොඳම ක්‍රමය වන්නේ ලෙක්ස් / යක් ශෛලිය තුළ මිස පාරදෘශ්‍ය එක්-ලයිනර් හෝ අදහස් දැක්වූ බහු-රේඛා රාක්ෂයන් ලෙස නොවේ. මම තවමත් මෙහි එය කළේ නැත; මේ අයට එය අවශ්‍ය නැත.


35
"මම හිතාමතාම කැඩී ඇති මෝඩ HTML විග්‍රහ කිරීමට උත්සාහ නොකරමි." ඔබේ කේතයේ වෙනස දන්නේ කෙසේද?
කෙවින් පැන්කෝ

HTML කැඩී ඇත්ද නැද්ද යන්න එතරම් වැදගත් නැත. කාරණය තවමත් HTML ටැග් සහ පෙළ වලට බෙදනු ඇත. එය අවුල් කළ හැකි එකම දෙය නම් මිනිසුන් විසින් නොවරදින <හෝ> අක්ෂර පෙළ හෝ ගුණාංගවල ඇතුළත් කර ඇත්නම් පමණි. ප්රායෝගිකව, මගේ කුඩා HTML ස්ප්ලිටරය හොඳින් ක්රියා කරයි. හියුරිස්ටික් වලින් පිරුණු දැවැන්ත මොන්ස්ට්‍රොසිටි චොක් මට අවශ්‍ය නැත. සරල විසඳුම් සෑම කෙනෙකුටම නොවේ ...!
සෑම් වොට්කින්ස්

XML / XHTML සඳහා ටැග්, පෙළ සහ ගුණාංග උකහා ගැනීම සඳහා මම සරල රීජෙක්ස් කිහිපයක් එකතු කළෙමි.
සෑම් වොට්කින්ස්

(ගුණාංග දෝෂ 1 ලබා ගන්න) /(\w+)="(.*?)"/ද්විත්ව උපුටා දැක්වීම් උපකල්පනය කරයි. එය තනි මිල ගණන් වල අගයන් මග හැරෙනු ඇත. HTML අනුවාදයේ 4 සහ ඊට පෙර සඳහන් නොකළ අගය සරල වචනයක් නම් අවසර දෙනු ලැබේ.
ඩේවිඩ් ඇන්ඩර්සන්

(ගුණාංග දෝෂ 2 ලබා ගන්න) /(\w+)="(.*?)"/ගුණාංගයක් තුළ ඇති ලක්ෂණයක් ලෙස පෙනෙන පෙළට ව්‍යාජ ලෙස ගැලපේ, උදා <img title="Nope down='up' for aussies" src="..." />. ගෝලීයව අදාළ වන්නේ නම්, එය සාමාන්‍ය පෙළ හෝ html අදහස් දැක්වීම් සමඟ ද ගැලපේ.
ඩේවිඩ් ඇන්ඩර්සන්

74

සමහර අභක්තික රීජෙක්ස් භාවිතා කරමින් HTML විග්‍රහ කරන PHP පදනම් කරගත් විග්‍රහකය මෙන්න . මෙම ව්‍යාපෘතියේ කතුවරයා වශයෙන්, HTML රීජෙක්ස් සමඟ විග්‍රහ කළ හැකි නමුත් කාර්යක්ෂම නොවේ. ඔබට සේවාදායක පාර්ශවීය විසඳුමක් අවශ්‍ය නම් (මගේ wp-Typography වර්ඩ්ප්‍රෙස් ප්ලගිනය සඳහා මා කළ පරිදි ), මෙය ක්‍රියාත්මක වේ.


1
htmlawed යනු තවත් PHP ව්‍යාපෘතියක් වන අතර එය පෙරීම, පරිවර්තනය කිරීම සඳහා HTML විග්‍රහ කරයි. ඔබට එය හඳුනාගත හැකි නම් හොඳ කේතයක් තිබේ!
user594694

ඔබට HTML රීජෙක්ස් සමඟ විග්‍රහ කළ නොහැක . නමුත් සමහර අනු කොටස් සඳහා, එය ක්‍රියාත්මක විය හැකිය .
mirabilos

70

HTML වෙනුවට BBCode සමඟ ප්‍රතිස්ථාපනය කිරීම සඳහා හොඳ රීජෙක්ස් කිහිපයක් තිබේ . ඔබ නොකියන සියල්ලන්ටම, ඔහු HTML සම්පූර්ණයෙන්ම විග්‍රහ කිරීමට උත්සාහ නොකරන බව සලකන්න. ඔහුගේ සරල "විග්‍රහකයාට" තේරුම් ගත නොහැකි ටැග් විනාශ කිරීමට ඔහුට බොහෝ විට ඉඩ දිය හැකිය.

උදාහරණයක් වශයෙන්:

$store =~ s/http:/http:\/\//gi;
$store =~ s/https:/https:\/\//gi;
$baseurl = $store;

if (!$query->param("ascii")) {
    $html =~ s/\s\s+/\n/gi;
    $html =~ s/<pre(.*?)>(.*?)<\/pre>/\[code]$2\[\/code]/sgmi;
}

$html =~ s/\n//gi;
$html =~ s/\r\r//gi;
$html =~ s/$baseurl//gi;
$html =~ s/<h[1-7](.*?)>(.*?)<\/h[1-7]>/\n\[b]$2\[\/b]\n/sgmi;
$html =~ s/<p>/\n\n/gi;
$html =~ s/<br(.*?)>/\n/gi;
$html =~ s/<textarea(.*?)>(.*?)<\/textarea>/\[code]$2\[\/code]/sgmi;
$html =~ s/<b>(.*?)<\/b>/\[b]$1\[\/b]/gi;
$html =~ s/<i>(.*?)<\/i>/\[i]$1\[\/i]/gi;
$html =~ s/<u>(.*?)<\/u>/\[u]$1\[\/u]/gi;
$html =~ s/<em>(.*?)<\/em>/\[i]$1\[\/i]/gi;
$html =~ s/<strong>(.*?)<\/strong>/\[b]$1\[\/b]/gi;
$html =~ s/<cite>(.*?)<\/cite>/\[i]$1\[\/i]/gi;
$html =~ s/<font color="(.*?)">(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<font color=(.*?)>(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<link(.*?)>//gi;
$html =~ s/<li(.*?)>(.*?)<\/li>/\[\*]$2/gi;
$html =~ s/<ul(.*?)>/\[list]/gi;
$html =~ s/<\/ul>/\[\/list]/gi;
$html =~ s/<div>/\n/gi;
$html =~ s/<\/div>/\n/gi;
$html =~ s/<td(.*?)>/ /gi;
$html =~ s/<tr(.*?)>/\n/gi;

$html =~ s/<img(.*?)src="(.*?)"(.*?)>/\[img]$baseurl\/$2\[\/img]/gi;
$html =~ s/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/\[url=$baseurl\/$2]$4\[\/url]/gi;
$html =~ s/\[url=$baseurl\/http:\/\/(.*?)](.*?)\[\/url]/\[url=http:\/\/$1]$2\[\/url]/gi;
$html =~ s/\[img]$baseurl\/http:\/\/(.*?)\[\/img]/\[img]http:\/\/$1\[\/img]/gi;

$html =~ s/<head>(.*?)<\/head>//sgmi;
$html =~ s/<object>(.*?)<\/object>//sgmi;
$html =~ s/<script(.*?)>(.*?)<\/script>//sgmi;
$html =~ s/<style(.*?)>(.*?)<\/style>//sgmi;
$html =~ s/<title>(.*?)<\/title>//sgmi;
$html =~ s/<!--(.*?)-->/\n/sgmi;

$html =~ s/\/\//\//gi;
$html =~ s/http:\//http:\/\//gi;
$html =~ s/https:\//https:\/\//gi;

$html =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gsi;
$html =~ s/\r\r//gi;
$html =~ s/\[img]\//\[img]/gi;
$html =~ s/\[url=\//\[url=/gi;

16
මෙය නොකරන්න. කරුණාකර.
maletor

68

(X) HTML විග්රහ කළ කිරීමට RegExp ක්රම ප්රශ්නය ගැන, සමහර සීමාවන් ගැන කතා කළ අය සියලු පිළිතුර වේ: පටන් ඔබ, මේ කියන ප්රබල අවියක් වන බලය පාලනය කිරීමට තරම් පුහුණු කර නැහැ කාටවත් මෙතන ගැන කතා කළා සහානුයාත වලට .

RegExp- අ nost ෙයවාදියාගේ සගයකු මට මෙම සාකච්ඡාව දැනුම් දුන්නේය, මෙය නිසැකවම මෙම පැරණි හා උණුසුම් මාතෘකාව පිළිබඳ වෙබයේ පළමු වැන්න නොවේ.

සමහර ලිපි කියවීමෙන් පසු, මම මුලින්ම කළේ මෙම ත්‍රෙඩ් එකේ “? ආර්” නූල සෙවීමයි. දෙවැන්න වූයේ “පුනරාවර්තනය” ගැන සෙවීමයි.
නැත, ශුද්ධ ගවයා, කිසිදු ගැලපීමක් හමු නොවීය.
විග්‍රහ කරන්නෙකු ගොඩනගා ඇති ප්‍රධාන යාන්ත්‍රණය කිසිවෙකු සඳහන් කර නැති නිසා, කිසිවෙකුට කාරණය වටහා ගත නොහැකි බව මම ඉක්මනින් දැන ගතිමි.

(X) HTML විග්‍රහකයෙකුට පුනරාවර්තනයක් අවශ්‍ය නම්, පුනරාවර්තනයකින් තොරව RegExp විග්‍රහකය ඒ සඳහා ප්‍රමාණවත් නොවේ. එය සරල ඉදිකිරීමකි.

RegExp හි කළු කලාව ප්‍රගුණ කිරීම අසීරු ය , එබැවින් මුළු වෙබ් අඩවියම එක් අතකින් ග්‍රහණය කර ගැනීම සඳහා අපගේ පුද්ගලික විසඳුම අත්හදා බැලීමේදී සහ අත්හදා බැලීමේදී අප අතහැර දමා ඇති තවත් අවස්ථා තිබේ ... හොඳයි, මට ඒ ගැන විශ්වාසයි :)

මෙන්න මැජික් රටාව:

$pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/s";

එය උත්සාහ කරන්න.
එය PHP නූලක් ලෙස ලියා ඇත, එබැවින් "s" විකරණකාරකය පන්ති වලට නව රේඛා ඇතුළත් කරයි.
මෙන්න මම ජනවාරි මාසයේ ලියා ඇති PHP අත්පොතේ නියැදි සටහනක් : යොමුව

.

දැන්, මෙම ක්‍රමයේ සීමාවන් ගැන වඩාත් දැනුවත් දෘෂ්ටි කෝණයකින් අපට කතා කළ හැකිය:

  1. RegExp එන්ජිම නිශ්චිතව ක්‍රියාත්මක කිරීම අනුව, පුනරාවර්තනයට විග්‍රහ කරන ලද කැදැලි රටා ගණනෙහි සීමාවක් තිබිය හැකි නමුත් එය භාවිතා කරන භාෂාව මත රඳා පවතී
  2. දූෂිත (x) HTML දැඩි දෝෂ වලට තුඩු නොදුනද එය සනීපාරක්ෂක නොවේ .

කෙසේ හෝ එය RegExp රටාවක් පමණක් වන නමුත් එය බලගතු ක්‍රියාත්මක කිරීම් රාශියක් වර්ධනය කිරීමේ හැකියාව අනාවරණය කරයි. මගේ රාමුව තුළ මා විසින් සාදන ලද අච්චු එන්ජිමක පුනරාවර්තන සම්භවය විග්‍රහ
කිරීමට බලය ලබා දීම සඳහා මම මෙම රටාව ලියා ඇති අතර, ක්‍රියාත්මක වන වේලාවන්හිදී හෝ මතක භාවිතයේදී (එකම සින්ටැක්ස් භාවිතා කරන වෙනත් අච්චු එන්ජින් සමඟ කිසිදු සම්බන්ධයක් නැත) කාර්ය සාධනය සැබවින්ම විශිෂ්ටයි.


36
මම මෙය "ගුණාංගවලට වඩා වැඩි ගණනකට ඉඩ නොදෙන රීජෙක්ස්" බඳුනට දමමි. <ආදාන අගය = "5> 3 ද?" />
ගරෙත්

68
ඔබ නිෂ්පාදන කේතයේ එවැනි දෙයක් තැබුවහොත්, ඔබට නඩත්තුකරු විසින් වෙඩි තබනු ඇත. ජූරි සභාවක් කිසි විටෙකත් ඔහු වරදකරු නොකරනු ඇත.
aehiilrs

30
නිත්‍ය ප්‍රකාශන ක්‍රියා කළ නොහැක්කේ අර්ථ දැක්වීම අනුව ඒවා පුනරාවර්තන නොවන බැවිනි. සාමාන්‍ය ප්‍රකාශන සඳහා පුනරාවර්තන ක්‍රියාකරුවෙකු එක් කිරීම මූලික වශයෙන් CFG එකක් කරන්නේ දුප්පත් සින්ටැක්ස් සමඟ පමණි. බාහිර ක්‍රියාකාරිත්වයෙන් දැනටමත් පිරී ඉතිරී යන දෙයකට පුනරාවර්තනය ප්‍රචණ්ඩ ලෙස ඇතුළු කරනවාට වඩා පුනරාවර්තන ලෙස නිර්මාණය කර ඇති දෙයක් භාවිතා නොකරන්නේ ඇයි?
වෙල්බොග්

16
මගේ විරෝධය ක්‍රියාකාරීත්වයේ එකක් නොවේ, එය ආයෝජනය කළ කාලයකි. රෙජෙක්ස් හි ඇති ගැටළුව නම්, ඔබ කට්සි කුඩා ලයිනර් පළ කරන විට ඔබ වඩාත් කාර්යක්ෂමව යමක් කළ බව පෙනේ ("කේතයේ එක් පේළියක් බලන්න!"). ඇත්ත වශයෙන්ම කිසිවෙකු ඔවුන්ගේ වංචා පත්‍රය සමඟ ගත කළ පැය භාගය (හෝ 3) ගැන සඳහන් කළ හැකි අතර (ආදාන) හැකි සෑම ප්‍රේරණයක්ම පරීක්ෂා කරයි. ඔබ ඒ සියල්ල පසු කළ පසු නඩත්තු කරන්නා කේතය සොයා ගැනීමට හෝ වලංගු කිරීමට ගිය විට ඔවුන්ට එය දෙස බලා එය නිවැරදි බව දැකිය නොහැක. ප්‍රකාශනය වි
ect ටනය කර

15
... එය හොඳ බව දැන ගැනීමට. රීජෙක්ස් සමඟ හොඳ අය සමඟ පවා එය සිදුවනු ඇත . අවංකවම මම සැක කරන්නේ අති බහුතරයක් දෙනා එය හොඳින් නොදන්නා බවය. එබැවින් ඔබ වඩාත් කුප්‍රකට නඩත්තු නපුරු සිහිනයක් ගෙන එය පුනරාවර්තනය සමඟ සංයෝජනය කර ඇති අතර එය අනෙක් නඩත්තු බියකරු සිහිනය වන අතර මගේ ව්‍යාපෘතියට මට සැබවින්ම අවශ්‍ය වන්නේ මඳක් අඩු බුද්ධිමත් අයෙකි. ඉලක්කය වන්නේ කේත පදනම කඩ නොකර නරක ක්‍රමලේඛකයන්ට නඩත්තු කළ හැකි කේත ලිවීමයි. මම දන්නවා එය අවම පොදු හරයට කේත කළ යුතු බව. නමුත් විශිෂ්ට දක්ෂතා බඳවා ගැනීම දුෂ්කර වන අතර ඔබ බොහෝ විට ...
ඔරං

62

බොහෝ අය දැනටමත් පෙන්වා දී ඇති පරිදි, HTML යනු විග්‍රහ කිරීම ඉතා අපහසු වන සාමාන්‍ය භාෂාවක් නොවේ. මේ සඳහා මගේ විසඳුම වන්නේ එය පිළිවෙලට ක්‍රමලේඛයක් භාවිතයෙන් සාමාන්‍ය භාෂාවක් බවට පත් කර ප්‍රති X ල පරිභෝජනය කිරීම සඳහා XML විග්‍රහකයක් භාවිතා කිරීමයි. මේ සඳහා හොඳ විකල්ප රාශියක් තිබේ. මගේ වැඩසටහන ලියා ඇත්තේ jtidy පුස්තකාලය සමඟ ජාවා භාවිතා කරමින් HTML එක XML බවටත් පසුව ජැක්සන් xpath කිරීමටත් ප්‍රති result ලය ලෙසය.


59
<\s*(\w+)[^/>]*>

පැහැදිලි කළ කොටස්:

<: ආරම්භක චරිතය

\s*: ටැග් නාමයට පෙර එයට හිස් අවකාශයන් තිබිය හැකිය (කැත නමුත් හැකි).

(\w+): ටැග් වල අකුරු සහ අංක අඩංගු විය හැකිය (h1). හොඳයි, \w'_' සමඟද ගැලපේ, නමුත් එය මා අනුමාන නොකරයි. කුතුහලයෙන් භාවිතා කරන්නේ නම් ([a-zA-Z0-9] +).

[^/>]*: මිස අන් කිසිවක් >හා /අවසන් වන තෙක්>

>: වසා දැමීම >

UNRELATED

සාමාන්‍ය භාෂාවන් තරම් බලවත් යැයි පවසමින් නිත්‍ය ප්‍රකාශන අවතක්සේරු කරන මිතුරන්ට:

නිත්‍ය නොවන සහ සන්දර්භය රහිතව ඇති n ba n ba n සමඟ සැසඳිය හැකිය^(a+)b\1b\1$

පසු විපරම් FTW !


@ ග්ලීච්මර්, එය ඔහුගේ අදහස විය. නවීන නිත්‍ය ප්‍රකාශන තාක්‍ෂණිකව නිත්‍ය නොවේ, ඒවා වීමට කිසිදු හේතුවක් නැත.
alanaktion

3
lanalanaktion: “නවීන” නිත්‍ය ප්‍රකාශන (කියවන්න: පර්ල් දිගු සමඟ) නොගැලපේ O(MN)(M නිත්‍ය ප්‍රකාශන දිග, N පෙළ දිග). පසු විපරම් ඊට එක් හේතුවකි. අවදිව ක්‍රියාත්මක කිරීමේදී පසු විපරම් නොමැති අතර O(MN)කාලය තුළ සියල්ලට ගැලපේ .
කොන්රාඩ් බොරොව්ස්කි

<a href="foo" title="5>3"> Oops </a>(උපුටා දක්වමින් @Gareth -. අමුතු ජනතාව හා හා පුරා මෙම විශේෂිත හිගයක් ඇති පිළිතුරු පළකිරීම තබා ආකාරය CDATA ආකාරයේ අමතක කිරීමට පහසු වන අතර, නමුත් මෙම වඩා වැඩි මූලික මිල)
Qwertie

55

ඔබ හුදෙක් එම ටැග් සොයා ගැනීමට උත්සාහ කරන්නේ නම් (විග්‍රහ කිරීමේ අභිලාෂයන් නොමැතිව) මෙම නිත්‍ය ප්‍රකාශනය උත්සාහ කරන්න:

/<[^/]*?>/g

මම එය තත්පර 30 කින් ලියා මෙහි පරීක්ෂා කළෙමි: http://gskinner.com/RegExr/

එය ඔබ සඳහන් කළ ටැග් වර්ග සමඟ ගැලපෙන අතර ඔබ නොසලකා හැරීමට අවශ්‍ය යැයි ඔබ කී වර්ග නොසලකා හැරේ.


2
මම හිතන්නේ ඔබ \/>ඒ වෙනුවට අදහස් \\>කළා.
ජස්ටින් මෝගන්

නැහැ, \>මා අදහස් කළේ එයයි; මගේ මුල් පෝස්ට් එකේ නිත්‍ය ප්‍රකාශනය සංස්කරණය කිරීමට මා කිසි විටෙකත් අදහස් නොකළෙමි.
ලොනී හොඳම

2
FYI, ඔබට කෝණ වරහන් වලින් ගැලවීමට අවශ්‍ය නැත. ඇත්ත වශයෙන්ම, කෙසේ හෝ ඔවුන්ගෙන් බේරීම කිසිදු හානියක් නොකරයි, නමුත් ඔබට වළක්වා ගත හැකි ව්‍යාකූලත්වය දෙස බලන්න. ;)
ඇලන් මුවර්

යමක් විශේෂ චරිතයක් ද නැද්ද යන්න ගැන මට සැකයක් ඇති විට මම සමහර විට අනවශ්‍ය ලෙස පැන යයි. මම පිළිතුර සංස්කරණය කර ඇත; එය එකම නමුත් වඩා සංක්ෂිප්තව ක්‍රියා කරයි.
ලොනී හොඳම

දැන් මෙය දෙස බලන විට, ඔබ අදහස් කළේ යැයි මා සිතුවේ මන්දැයි මම නොදනිමි, මන්ද \/එය අවශ්‍යතාවන්ට ප්‍රතිවිරුද්ධ දෙයකි. සමහර විට මම හිතුවේ ඔබ සෘණ පෙරහන් රටාවක් ඉදිරිපත් කරයි කියා.
ජස්ටින් මෝගන්

53

මට පෙනෙන පරිදි ඔබ අවසානයේ "/" නොමැතිව ටැග් ගැලපීමට උත්සාහ කරයි. මේක උත්සාහ කරන්න:

<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>

9
මෙය ක්‍රියාත්මක නොවේ. ආදානය සඳහා '<xa = "<b>" /> <y>' x අවසන් වූවත් ගැලපීම් x සහ y වේ.
ceving

51

ක්‍රමලේඛනය කිරීමේදී සාමාන්‍යයෙන් HTML සමඟ ගනුදෙනු කිරීමේදී සාමාන්‍ය ප්‍රකාශන වෙනුවට කැපවූ පාර්සර් සහ ඒපීඅයි භාවිතා කිරීම වඩාත් සුදුසු බව සත්‍යයකි, විශේෂයෙන් නිරවද්‍යතාව ඉතා වැදගත් නම් (උදා: ඔබේ සැකසුම් වලට ආරක්ෂක ඇඟවුම් තිබේ නම්). කෙසේ වෙතත්, එක්ස්එම්එල්-ශෛලීය සලකුණු කිරීම කිසි විටෙකත් සාමාන්‍ය ප්‍රකාශන සමඟ සැකසිය යුතු නැතැයි මම ප්‍රබන්ධ මතයකට නොකියමි. පෙළ සංස්කාරකයක එක් වරක් සංස්කරණ සිදු කිරීම, කැඩුණු XML ලිපිගොනු සවි කිරීම, හෝ XML මෙන් පෙනෙන නමුත් ගොනු ආකෘති සමඟ ගනුදෙනු කිරීම වැනි නිත්‍ය ප්‍රකාශන කාර්යය සඳහා හොඳ මෙවලමක් වන අවස්ථා තිබේ. දැනුවත් විය යුතු ගැටළු කිහිපයක් ඇත, නමුත් ඒවා ජයගත නොහැකි හෝ අවශ්‍යයෙන්ම අදාළ නොවේ.

<([^>"']|"[^"]*"|'[^']*')*>මම දැන් සඳහන් කළ අවස්ථා වැනි සරල රීජෙක්ස් සාමාන්‍යයෙන් ප්‍රමාණවත්ය. එය බොළඳ විසඳුමක්, සියල්ල සලකා බැලූ නමුත් එය >ගුණාංග අගයන්හි කේතනය නොකළ සංකේත නිවැරදිව ඉඩ දෙයි . ඔබ සොයන්නේ නම්, උදා, tableටැගයක්, ඔබට එය අනුවර්තනය කළ හැකිය </?table\b([^>"']|"[^"]*"|'[^']*')*>.

වඩාත් “දියුණු” HTML රීජෙක්ස් පෙනුම කෙබඳුද යන්න පිළිබඳ අවබෝධයක් ලබා දීම සඳහා, පහත දැක්වෙන්නේ තථ්‍ය-ලෝක බ්‍රව්සර් හැසිරීම සහ HTML5 විග්‍රහ කිරීමේ ඇල්ගොරිතම අනුකරණය කිරීමේ තරමක් ගෞරවනීය කාර්යයකි:

</?([A-Za-z][^\s>/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)

පහත දැක්වෙන්නේ එක්ස්එම්එල් ටැග් පිළිබඳ තරමක් දැඩි අර්ථ දැක්වීමකට ගැලපේ (එක්ස්එම්එල් නම් වලින් අවසර දී ඇති යුනිකෝඩ් අක්ෂරවල සම්පූර්ණ කට්ටලයට එය ගණන් නොගත්තද):

<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s*/?|/([_:A-Z][-.:\w]*)\s*)>

අවට සන්දර්භය සහ අද්දර අවස්ථා කිහිපයක් සඳහා මේවා ගණන් නොගන්නා බව පිළිගත යුතුය, නමුත් ඔබට සැබවින්ම අවශ්‍ය නම් එවැනි දේ සමඟ පවා කටයුතු කළ හැකිය (උදා: වෙනත් රීජෙක්ස් වල තරඟ අතර සෙවීමෙන්).

දවස අවසානයේදී, කාර්යය සඳහා වඩාත් සුදුසු මෙවලම භාවිතා කරන්න, එම මෙවලම රීජෙක්ස් එකක් වූ විට පවා.


49

එම අරමුණු සඳහා නිත්‍ය ප්‍රකාශන භාවිතා කිරීම සුදුසු සහ effective ලදායී නොවුවද, සමහර විට නිත්‍ය ප්‍රකාශන සරල ගැලපුම් ගැටළු සඳහා ඉක්මන් විසඳුම් ලබා දෙන අතර සුළු කාරණා සඳහා නිත්‍ය ප්‍රකාශන භාවිතා කිරීම එතරම් භයානක නොවේ.

ස්ටීවන් ලෙවිටන් විසින් රචිත අභ්‍යන්තරතම HTML අංග ගැලපීම පිළිබඳ නිශ්චිත බ්ලොග් සටහනක් තිබේ .

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.