wyrażenia regularne - kolorowanie składni

0

Część, mam mały problem, męczę się od 2 dni.
Doszedłem do kodu:

	tresc='tekst z pola pre...';
	t = tresc.replace(/<\//g,'&lt;&frasl;');
	t = t.replace(/\/>/g,'&frasl;&gt;');
	t = t.replace(/</g,'&lt;');
	t = t.replace(/>/g,'&gt;');
	

	nt = t.replace(/&lt;&frasl;(\!DOCTYPE|\!doctype|acronym|address|applet|basefont|blockquote|button|caption|colgroup|fieldset|frame|frameset|iframe|isindex|label|legend|noframes|noscript|object|optgroup|option|param|script|select|strike|strong|textarea|center|input|tbody|table|style|title|tfoot|thead|small|samp|meta|menu|link|html|head|form|font|code|cite|body|base|area|abbr|span|pre|col|del|dfn|dir|div|img|ins|kbd|map|sub|sup|var|bdo|big|dd|dl|dt|em|h1|h2|h3|h4|h5|h6|hr|td|ol|li|th|tr|tt|ul|br|a|b|p|i|q|s|u)&gt;/ig,"<span class=ex1>&lt;&frasl;$1&gt;</span>");
	nt = nt.replace(/&lt;(\!DOCTYPE|\!doctype|acronym|address|applet|basefont|blockquote|button|caption|colgroup|fieldset|frame|frameset|iframe|isindex|label|legend|noframes|noscript|object|optgroup|option|param|script|select|strike|strong|textarea|center|input|tbody|table|style|title|tfoot|thead|small|samp|meta|menu|link|html|head|form|font|code|cite|body|base|area|abbr|span|pre|col|del|dfn|dir|div|img|ins|kbd|map|sub|sup|var|bdo|big|dd|dl|dt|em|h1|h2|h3|h4|h5|h6|hr|td|ol|li|th|tr|tt|ul|br|a|b|p|i|q|s|u)&gt;/ig,"<span class=ex1>&lt;$1&gt;</span>"); 
	nt = nt.replace(/&lt;(\!DOCTYPE|\!doctype|acronym|address|applet|basefont|blockquote|button|caption|colgroup|fieldset|frame|frameset|iframe|isindex|label|legend|noframes|noscript|object|optgroup|option|param|script|select|strike|strong|textarea|center|input|tbody|table|style|title|tfoot|thead|small|samp|meta|menu|link|html|head|form|font|code|cite|body|base|area|abbr|span|pre|col|del|dfn|dir|div|img|ins|kbd|map|sub|sup|var|bdo|big|dd|dl|dt|em|h1|h2|h3|h4|h5|h6|hr|td|ol|li|th|tr|tt|ul|br|a|b|p|i|q|s|u)([^<]*)&gt;/ig,"<span class=ex1>_&lt;$1</span>$2<span class=ex1>&gt;_</span>"); //([^>]*)
	
	nt = nt.replace(/([^ ]+)\="([^ ]+)"/g,"<span class=ex2>$1</span>=<span class=ex3>\"$2\"</span>");
	nt = nt.replace(/([^ ]+)\="(.+)"/g,"<span class=ex2>$1</span>=<span class=ex3>\"$2\"</span>");
	
	nt = nt.replace(/&lt;\!--(.*)--&gt;/g,"<span class=ex5>&lt;!--$1--&gt;</span>");

Na początku zamieniam <,> oraz /
Następnie Zamieniam wszystkie znaczniki html-a.
Problem: czasami omija znak >
np: <p style="color: black">Tekst</p__>__

Następnym błędem jest kolorowanie tekstu komentarzu, gdy jest w jednej lini dobrze koloruje, a gdy jest w kilku linijkach nie koloruje.

Zna się ktoś na wyrażeniach? Proszę o pomoc.

4

Jest takie stare powiedzenie "Jeśli masz problem i uważasz, że rozwiążesz go za pomocą wyrażeń regularnych, to masz już dwa problemy" :)
Co ten program ma robić?

0

Chce zrobić własne kolorowanie składni, To co dałem w poprzednim poście koloruje znaczniki <b><i> i tak dalej, lecz gdy podaje do kolorowania:

<!-- Komentarz <b>p</b>-->

<!-- 
Komentarz s
-->

	<p>trochę <b>tekstu</b>, <br />
	który został <br>
	przełamany</p>
	<a href="http://www.moje.pl">tekst</a>
	<span class="color: blue;">Tekst spanu</span>
	<BIG>tekst</BIG>
	<input value="coś t" name=nazwa>
	<div id=id1>block</div>
	<div id=id1 class="tak">block 2</div>
	
	<h1>Tytuł 1</h1>

koloruje:

http://zapodaj.net/c72643c517a1e.png.html

jest kilka niedociągnięć w input i div.

0
kikarto napisał(a):

Następnym błędem jest kolorowanie tekstu komentarzu, gdy jest w jednej lini dobrze koloruje, a gdy jest w kilku linijkach nie koloruje.

przełącznik "s"?

mógłbyś wrzucić tagi html do tablicy i je wrzucać w wyrażenie przez implode żeby nie robić kilometrowych linijek i dało się to przeczytać...
ale nikt tu raczej nie będzie i tak poprawiał tu tych wyrażeń bo to dość nieprzyjemna robota

poza tym piszesz to samemu bo...?

serverside (PHP): GeSHi
clientside (JavaScript): http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/

problem z własnym rozwiązaniem jest taki że jeszcze zejdą ci miesiące na testowaniu w praktyce zanim wyłapiesz wszystkie szczególiki które masz niedopracowane
przykładowo - już na starcie Twoje kolorowanie jest przestarzałe
zawiera wszystkie tagi które już w najnowszej wersji html nawet nie istnieją lub są "deprecated", ale za to nie masz ani jednego tagu z nowej specyfikacji ;)

0

Wiem że jest tego dużo w necie, lecz chciałem swoje napisać, jest to jakaś satysfakcja
Jak na razie wziąłem html4 (kopiuj wklej z jakiejś strony i je rozdzieliłem)

Piszesz 'implode z tablicy', jutro pokombinuję

0

no tak, ale jeżeli ktoś tutaj za Ciebie napisze te wyrażenia poprawnie a wyrażenia są jedynym elementem w tym zadaniu to jaka to będzie satysfakcja dla Ciebie? :>
i czym będzie się to różniło dla Ciebie od wykorzystania gotowych skryptów?

0

wystarczy jedna linijka do kolorowania tagu
/<(\/?)(input|span|...)([^<]*)>/ig

Jak na razie potrzebne mi było tylko html

0
kikarto napisał(a):

wystarczy jedna linijka do kolorowania tagu
/<(\/?)(input|span|...)([^<]*)>/ig

Jak na razie potrzebne mi było tylko html

(.*?) zamiast ([^<]*)

jakbyś nie zauważył to nie masz już "<" tylko "&lt;"
a żeby (nie) przypasować więcej niż jeden znak musiałbyś robić look-ahead
lepiej zrobić leniwe przypasowanie

1 użytkowników online, w tym zalogowanych: 0, gości: 1