Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Koodin väritys (C++-koodille)

Sivun loppuun

Metabolix [03.05.2009 01:46:02]

#

Taas kerran huomasin, että Ohjelmointiputkan kooditagien C++-väritys on hyvin alkeellinen: se tunnistaa kommentit ja korostaa kaikki avainsanat — nekin, jotka ovat lainausmerkeissä eivätkä siis toimi koodissa avainsanoina vaan tekstivakioina. Tästä innostuin tekemään oman funktion C++-koodin väritykseen, josko joskus myös Ohjelmointiputkan koodiin otettaisiin siitä oppia ja koodista tulisi kirjavampaa.

Koodin väritys onnistuu parhaiten säännöllisillä lausekkeilla. Ensin kannattaa muodostaa pitävät lausekkeet erilaisille elementeille kuten kommenteille, tekstille, luvuille jne. Tässä koodissa nämä lausekkeet on koottu taulukkoon, josta ne sitten yhdistetään nimettyinä ryhminä yhdeksi säännölliseksi lausekkeeksi. C++-koodi ajetaan preg_replace_callback-funktion läpi, jolloin jokaiseen osumaan eli jokaiseen löytyneeseen elementtiin sovelletaan itse määriteltyä funktiota. Tämä jälkimmäinen funktio taas tarkistaa, mikä elementti löytyi, ja lisää sen ympärille sopivan HTML-koodin väritystä varten. Väritys tehdään CSS-luokilla, jolloin voidaan värien lisäksi käyttää helposti muitakin korostustapoja. Siinä sivussa myös HTML:n erikoismerkit (<>"&) muuttuvat vastaaviksi erikoismerkinnöiksi (&lt; jne.), jolloin myös koodin sisältämät HTML-tagit näkyvät koodissa tekstinä, kuten niiden tietenkin pitää.

Osumaan johtavia lausekkeita on turha tässä käydä läpi, jokainen voi itse tutustua C++:n syntaksiin ja todeta, että lausekkeet todella toimivat sen kanssa. Koodivinkin funktiot voi helposti valjastaa värjäämään muidenkin ohjelmointikielten koodeja, kunhan syntaksi on selvillä.

Varsinaiset funktiot ovat tässä runsaasti kommentoituina:

<?php # cpp.php

/**
 * Funktio muuttaa C- tai C++-koodin HTML-muotoon.
 *
 * Koodista tunnistettavat elementit ovat seuraavat:
 *   - kommentit (CSS: .comment)
 *   - teksti (CSS: .string)
 *   - merkit (CS: .char)
 *   - luvut (CSS: .number)
 *   - esikääntäjän komennot (CSS: .preprocessor)
 *   - tyhjä (CSS: .whitespace)
 *   - avainsanat (CSS: .reserved)
 *   - operaattorit (CSS: .operator)
 *   - operaattorisanat (CSS: .operator_word)
 *   - nimet (CSS: .identifier)
 * Näistä nimet, operaattorit ja tyhjä jätetään oletusarvoisesti värittämättä.
 * (ks. funktio html_cpp_format)
 *
 * Koodista on kommentoitu pois pari vaihtoehtoista osumatapaa.
 *
 * @param string $str Muunnettava koodi.
 * @return string Paluuarvona on muunnettu koodi.
 */
function html_cpp($str) {
	# Säännöllinen lauseke rivinvaihdolle:
	$nl = $new_line = "(?>\r\n|\r|\n)";
	# Vastaava look-ahead, joka ei ota merkkejä mukaan osumaan:
	$lanl = $look_ahead_new_line = "(?={$nl})";
	# Käänteinen versio edellisestä.
	$lannl = $look_ahead_no_new_line = "(?!{$nl})";
	# Jos rivi loppuu \-merkkiin, esikääntäjä yhdistää sen seuraavaan.
	# Tehdään lauseke tämän tunnistamiseen.
	$pnl = $preprocessor_new_line = "(?>\\\\{$nl})*";

	# Muodostetaan lausekkeet eri tilanteisiin:
	$comment1 = "(?>/{$pnl}/{$pnl}(?:.*?{$pnl})*?{$lanl})";
	$comment2 = "(?>/{$pnl}\\*(?:.*?{$nl}?)*?\\*{$pnl}/)";
	$comment = "(?>$comment1|$comment2)";
	$string = "(?>(?>L{$pnl})?\"(?>[^\\\\\"]*(?>\\\\{$pnl}{$lannl}.)*{$pnl})*\"{$pnl})";
	$char = "(?>(?>L{$pnl})?'(?>{$pnl}(?>[^\\\\']|(?>\\\\{$pnl}{$lannl}.))+{$pnl})+'{$pnl})";
	$word = "(?>[A-Za-z_]{$pnl}(?>[A-Za-z0-9_]+{$pnl})*)";
	$number = "(?>(?>\\.{$pnl})?[0-9](?>(?>(?>[eEpP]{$pnl}[-+])|[A-Za-z0-9_.])*{$pnl})*)";
	$whitespace = "(?>(?>(?>[ \t\f\v]+{$pnl})+{$nl}?)|{$nl})";
	# Tämä ottaisi esikääntäjän komennon loppuun asti:
	#$preprocessor = "(?:^(?:[ \t\f\v]+{$pnl})*#(?:.*?{$pnl})*{$lanl})";
	# Tämä ottaisi sen vain komentosanan loppuun:
	#$preprocessor = "(?:^(?:[ \t\f\v]+{$pnl})*#(?:[ \t\f\v]*{$pnl})*(?:[A-Za-z0-9_]*{$pnl})*)";
	# Tämä ottaa lisäksi tavallisen includen tiedostonimen hakasuluista:
	$preprocessor = "(?>^(?>[ \t\f\v]+{$pnl})*#(?>[ \t\f\v]*{$pnl})*(?>(?>include[ \t]*\\<[^>]+\\>)|(?>[A-Za-z0-9_]*{$pnl})*))";
	$operator = html_cpp_operator_regex($pnl);
	# Muut kuin esiintyneet merkit ovat virheellisiä,
	# ja virheeksi kelpaa myös yksi mikä tahansa merkki,
	# jos sitä ei ole tunnistettu aiemmin.
	# Lisäksi tunnistetaan tyhjä '' virheeksi, jolloin
	# lausekkeesta '' + 'b' värittyy '' virheeksi ja 'b' merkiksi.
	$chars_ok = "\\-A-Za-z0-9_" . preg_quote("!#%&()*+,./:;<=>?[]^{|}~\"' \t\f\v\r\n");
	$error = "(?>'{$pnl}'|(?>[^$chars_ok](?>[^$chars_ok]*{$pnl})*)|.)";

	# Kootaan lausekkeet taulukkoon.
	# Järjestys on tärkeä, jottei aiempi lauseke voi osua sellaiseen,
	# johon kuuluisi myöhempi, esim. operaattori # esikääntäjän riveissä.
	$regex_arr = compact(
		"string", "char", "word", "comment", "preprocessor",
		"whitespace", "number", "operator", "error"
	);

	# Muutetaan lausekkeet nimetyiksi ryhmiksi ja yhdistetään.
	$named = array();
	foreach ($regex_arr as $name => $exp) {
		$named[] = "(?P<$name>$exp{$pnl})";
	}
	$regex = sprintf("`(%s)`m", implode("|", $named));

	# Haetaan osumat ja käsitellään ne html_cpp_match-funktiolla.
	$res = preg_replace_callback($regex, "html_cpp_match", $str);

	# Jos korvaus menee pieleen, palautetaan väritön, HTML-muotoinen koodi.
	if (empty($res)) {
		$res = htmlspecialchars($str);
	}
	return "<pre class='cpp'><code>$res</code></pre>";
}

/**
 * Funktiota käytetään preg_replace_callback-funktion callback-parametrina.
 * Se muuttaa löytyneen C++-pätkän HTML-muotoon.
 *
 * @param array $match Osuman tiedot taulukkona preg_replace_callback-funktiota.
 * @return string Paluuarvona on HTML-muotoinen esitys osumasta.
 */
function html_cpp_match($match) {
	# Haetaan osumasta viimeinen nimetty ryhmä ja muotoillaan se.
	# Käydään siis taulukkoa lopusta alkuun, kunnes löytyy
	# tekstillä nimetty ryhmä.
	end($match);
	while (!is_string(key($match))) {
		prev($match);
	}
	$type = key($match);
	$str = current($match);
	return html_cpp_format($type, $str);
}

/**
 * Funktio palauttaa säännöllisen lausekkeen osan, joka tunnistaa operaattorit.
 *
 * @param string $pnl esikääntäjän rivinvaihdon tunnistus
 * @return string Paluuarvona säännöllisen lausekkeen osa.
 */
function html_cpp_operator_regex($pnl = "") {
	# Säilötään vastausta ja palautetaan vanha, jos on jo koottu se.
	static $operator;
	if (!empty($operator)) {
		return $operator;
	}
	# Lista operaattoreista on järjestetty niin, että pisimmät kokeillaan
	# ensin, jottei <<:sta tulisi vahingossa kahta erillistä <:ta.
	/*
	$operators = array(
		'~', '}', '||', '|=', '|', '{', '^=', '^', ']', '[', '?', '>>=',
		'>>', '>=', '>', '==', '=', '<=', '<<=', '<<', '<:', '<%', '<',
		';', ':>', '::', ':', '/=', '/', '...', '.*', '.', '->*', '->',
		'-=', '--', '-', ',', '+=', '++', '+', '*=', '*', ')', '(',
		'&=', '&&', '&', '%>', '%=', '%:%:', '%:', '%', '##', '#', '!=',
		'!'
	);
	*/
	# Valmiiksi muotoillut säännölliset lausekkeet helpottavat tilannetta.
	# Kaikkiin väleihin on taas lisätty esikääntäjän rivinvaihdot.
	$operators = array(
		# nelimerkkiset
		"(?>%{$pnl}\\:{$pnl}%{$pnl}\\:)",
		# >>=? <<=?
		"(?>(?>(?>\\<{$pnl}\\<)|(?>\\>{$pnl}\\>)){$pnl}\\=?)",
		# ->*?
		"(?>-{$pnl}\\>{$pnl}\\*?)",
		# toistot, &&, ...
		"(?:\\|{$pnl}\\|)|(?:\\:{$pnl}\\:)|(?:\\.{$pnl}\\.{$pnl}\\.)",
		"(?:\\-{$pnl}\\-)|(?:\\+{$pnl}\\+)|(?:&{$pnl}&)|(?:#{$pnl}#)",
		# kaksimerkkiset, .=
		"(?:[|^>=</\\-*&%!]{$pnl}\\=)",
		# muut kaksimerkkiset
		"(?:\\<{$pnl}[:%])|(?:[:%]{$pnl}\\>)|(?:\\.{$pnl}\\*)|(?:%{$pnl}\\:)",
		# yksimerkkiset
		"[~}|{^\\]\\[?>=<;:/.\\-,+*)(&%#!]",
	);
	$operator = sprintf("(?>(?>%s){$pnl})", implode("|", $operators));
	return $operator;
}

/**
 * Funktio selvittää löytyneen sanan tyypin (varattu sana, nimi, operaattori).
 *
 * @param string $str Sana.
 * @return string Paluuarvona on sanan tyyppi.
 */
function html_cpp_word_type(&$str) {
	# Listat C++:n varatuista sanoista ja operaattorisanoista;
	# staattisuudella optimoidaan koodia, kun taulukkoa ei luoda joka kerta,
	# ja siirtämällä sanat taulukon avaimiksi nopeutetaan sanan etsimistä.
	static $cpp_reserved_words, $cpp_operator_words;
	if (empty($cpp_reserved_words)) {
		$cpp_reserved_words = array(
			'asm', 'auto', 'bool', 'break', 'case', 'catch', 'char',
			'class', 'const', 'const_cast', 'continue', 'default', 'do',
			'double', 'dynamic_cast', 'else', 'enum', 'explicit', 'export',
			'extern', 'false', 'float', 'for', 'friend', 'goto', 'if',
			'inline', 'int', 'long', 'mutable', 'namespace', 'operator',
			'private', 'protected', 'public', 'register',
			'reinterpret_cast', 'return', 'short', 'signed', 'sizeof',
			'static', 'static_cast', 'struct', 'switch', 'template', 'this',
			'throw', 'true', 'try', 'typedef', 'typeid', 'typename',
			'union', 'unsigned', 'using', 'virtual', 'void', 'volatile',
			'while', 'wchar_t',
		);
		$cpp_operator_words = array(
			'new', 'delete',
			'and', 'and_eq', 'bitand', 'bitor', 'compl', 'not', 'not_eq',
			'or', 'or_eq', 'xor', 'xor_eq',
		);
		$cpp_reserved_words = array_flip($cpp_reserved_words);
		$cpp_operator_words = array_flip($cpp_operator_words);
	}
	# Poistetaan esikääntäjän rivinvaihdot, jotta sana tunnistetaan oikein.
	$word = preg_replace("/[^A-Za-z0-9_]/s", "", $str);

	# Katsotaan, mistä listasta sana löytyy.
	if (isset($cpp_reserved_words[$word])) {
		return "reserved";
	} elseif (isset($cpp_operator_words[$word])) {
		return "operator_word";
	} else {
		# Tuntemattomat sanat ovat nimiä.
		return "identifier";
	}
}

/**
 * Funktio muuttaa löytyneen C++-pätkän HTML-muotoon.
 *
 * @param string $type Osuman tyyppi (comment, string, char etc.)
 * @param string $str Osuman teksti.
 * @return string Paluuarvona on HTML-muotoinen esitys osumasta.
 */
function html_cpp_format(&$type, &$str) {
	# Jos löytyi tarkemmin määrittelemätön sana, tarkistetaan,
	# onko se ehkä varattu sana tai operaattori.
	if ($type == "word") {
		$type = html_cpp_word_type($str);
	}

	# Luodaan osuman HTML-esitys (erikoismerkit HTML-muodossa)
	$html = htmlspecialchars($str);

	# Jätetään satunnaiset nimet, operaattorit ja tyhjä värittämättä.
	# Nämäkin voi tietysti värittää, jos haluaa.
	$ignore = array("identifier", "operator", "whitespace");
	if (in_array($type, $ignore)) {
		return $html;
	}
	# Väreihin käytetään CSS-luokkia, jotta väritystä on helppo muuttaa.
	return "<span class='{$type}'>{$html}</span>";
}
?>

Väritystiedot pitää kirjoittaa CSS-tiedostoon. Tässä on yksi mahdollinen värivalikoima:

/* cpp.css */
/* pre ja code ovat koko koodin ympärillä;
 * asetetaan reunat ja tarvittaessa vierityspalkki */
pre.cpp {
	display: block;
	border: 1px solid black;
	margin: 2px;
	padding: 2px;
	background-color: white;
	width: 99%;
	overflow: auto;
}
.cpp code {
	color: black;
}
/* nämä jätettiin PHP:ssä värjäämättä mutta nekin voisi:
.cpp .identifier, .cpp .operator, .cpp .whitespace {
	color: black;
}
*/
.cpp .comment {
	color: green;
}
.cpp .preprocessor {
	color: teal;
}
.cpp .reserved, .cpp .operator_word {
	color: navy;
	font-weight: bold;
}
.cpp .string {
	color: maroon;
}
.cpp .char, .cpp .number {
	color: blue;
}
.cpp .error {
	color: red;
}

/* DEBUG: piirretään laatikko joka ryhmän ympärille
.cpp span {
	border: 1px solid green;
}
*/
/* cpp-ie.css */
/* IE:ssä on bugeja vierityspalkkien kanssa, korjataan asia */
pre.cpp {
	overflow-x: auto;
	overflow-y: hidden;
	padding-bottom: 20px;
}

Käytössä koodi toimii näin:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">
<head>
	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
	<meta http-equiv="Content-Language" content="fi" />
	<title>C++-väritysesimerkki</title>
	<style type="text/css" media="all">@import "cpp.css";</style>
	<!--[if IE]>
		<style type="text/css" media="all">@import "cpp-ie.css";</style>
	<![endif]-->
</head>
<body>
<?php
require_once("cpp.php");
$koodi = file_get_contents("esim.cpp");
echo html_cpp($koodi);
?>
</body>
</html>

Testaukseen voi käyttää vaikkapa tätä C++-koodia (esim.cpp):

#include <iostream>
#if 0
	#include "omaotsikko.hpp"
#elif 0
	#	error "moi"
#endif

#defi\
ne F(x) \
int x %:%\
: _muuttuja

F(moi);

using namespace std;

class X {
public:
	X& operator ++(int) { return *this; }
	X& operator ++() { return *this; }
};

type\
def float taulu[3];

int main(int argc, char **argv) {
	taulu t;
	t[0] = 0x12ul;
	t[1] = 0377LU;
	t[2] = 1.12e-6L + 1e3f + 2. + .6;
	X x, y = x++++;
	std::cout
		<< "t[2] (float) == \"" << t[2] << "\"\\" << std::endl // << kommentti;
		// kommentteja pitäisi voida \
		   jatkaa monelle riville
		<< "char c = " << '\'' << (int) L'x' << '\'' << std::endl;
	std::cout <<
"Tekstikin voi olla \
\
monta riviä pitkä.\n";
/*
 * Tästäpä ei mikä tahansa viritys selviä: *\
/
std::cout <<
"Myös escape voi jakautua monelle riville: \\
n jee \\
", samoin luvut: " << 12.\
34e-\
1l << std::endl;
// */
	return 0;
}

Esimerkkiohjelma on ainakin GCC:n mukaan täysin kelvollinen C++-ohjelma; sen tuloste näyttää tältä:

t[2] (float) == "1002.6"\
char c = '120'
Tekstikin voi olla monta riviä pitkä.
Myös escape voi jakautua monelle riville:
 jee ", samoin luvut: 1.234

Värityksessä saattaa olla yhä bugeja, ja niistä voi käydä kommentoimassa tähän. Kokonaisen syntaksin väritys ei ole aivan yksioikoista, kuten näkyy jo skriptin pituudestakin.

Olli [03.05.2009 17:52:45]

#

Hieno funktio! Hyvä että joku jaksaa koodailla Ohjelmointiputkaan, kun koodeja tulee nykyään niin vähäkseltään.

Antti Laaksonen [03.05.2009 18:34:07]

#

Metabolix kirjoitti:

Tästä innostuin tekemään oman funktion C++-koodin väritykseen, josko joskus myös Ohjelmointiputkan koodiin otettaisiin siitä oppia ja koodista tulisi kirjavampaa.

Saako oppia ottaa niinkin paljon, että tämä koodi kopioidaan melkein sellaisenaan viestit muotoilevaan PHP-tiedostoon?

Metabolix kirjoitti:

Värityksessä saattaa olla yhä bugeja, ja niistä voi käydä kommentoimassa tähän.

Jos äsken mainittu toteutuu, väritys joutuu ainakin tulikokeeseen.

Metabolix [03.05.2009 19:36:51]

#

Antti Laaksonen kirjoitti:

Saako oppia ottaa niinkin paljon, että tämä koodi kopioidaan melkein sellaisenaan viestit muotoilevaan PHP-tiedostoon?

Tämä sopii oikein hyvin. Pyrinkin tekemään koodin sillä ajatuksella, että sitä olisi mahdollisimman helppo soveltaa sellaisenaan erilaisiin järjestelmiin. CSS-väritys kannattaa säilyttää, jotta esimerkiksi Firefoxilla voi määritellä itselleen mieluisat värit täälläkin näkyviin koodeihin.

Oikeastaan suurin huolenaihe on mutkikkaan säännöllisen lausekkeen ja siihen liittyvän korvausfunktion nopeus. Tein nyt koodiin muutaman muutoksen, joilla suoritusaika väheni jopa kuutisenkymmentä prosenttia. Edit: Järjestin säännöllistä lauseketta uudestaan niin, että yleisimmät asiat ovat ensimmäisinä, ja uudestakin suoritusajasta putosi 40 prosenttia pois tyypillisessä tapauksessa. Nyt 800 rivin (20000 merkin) koodi värittyy omalla koneellani 0,3 sekunnissa.

Yksi jo tunnettu bugi on se, että include-komentoa ei käsitellä erikseen, jolloin esimerkiksi #include <float.h> tuottaa väritetyn float-sanan. Kyseessä on kuitenkin niin pieni seikka, ettei sitä minusta kannata korjata.

Koodia tehdessäni preg_replace_callback rupesi jo toimimaan kummallisesti, kun säännöllinen lauseke kasvoi joitakin kymmeniä merkkejä nykyistä pidemmäksi, eli ilmeisesti silläkin on jonkinlaisia rajoituksia ryhmien määrän tai pituuden suhteen.

Ajattelin tehdä funktiosta vielä hieman toisenlaisen version ja testata, kumpi on nopeampi.

janijohannes [04.05.2009 20:16:24]

#

Hyvin olet kyllä jaksanut tätä koodata.

Ihmetyttää vain, miksi minun koodeistani ei yhtäkään ole hyväksytty (edes sitä ASM-viritystä)...

Metabolix [04.05.2009 21:00:52]

#

Korvasin säännölliset lausekkeet paremmilla. Väritys on nyt entistä varmempi, ja nopeuskin on mystisesti parantunut vielä hieman.

Koodin seassa on jokunen kohta, joita muokkaamalla voi helposti vaikuttaa lopputulokseen. Oletusasetusten pitäisi kuitenkin olla aika hyvät.

janijohannes kirjoitti:

Ihmetyttää vain, miksi minun koodeistani ei yhtäkään ole hyväksytty (edes sitä ASM-viritystä)...

Ehkäpä juuri sen virityksen takia. Useimmissa vinkeissäsi ei yksinkertaisesti ole julkaisun kannalta mielekästä sisältöä. (Katso itse uudestaan ja mieti, mitä lukijana saisit niistä irti.) BF-vinkin ongelma taas on minusta lähinnä huono selostus: ainakaan minulle ei selostuksen ja kommenttien perusteella selvinnyt, minkä lukujonon tuo tulostaa, vaan jouduin testaamaan. Sitäpaitsi tuloste ei ole oktaali- vaan kymmenjärjestelmämuodossa, vaikka nimenomaan toisin väität.

janijohannes [05.05.2009 14:47:43]

#

Metabolix kirjoitti:

janijohannes kirjoitti:

Ihmetyttää vain, miksi minun koodeistani ei yhtäkään ole hyväksytty (edes sitä ASM-viritystä)...

Ehkäpä juuri sen virityksen takia. Useimmissa vinkeissäsi ei yksinkertaisesti ole julkaisun kannalta mielekästä sisältöä. (Katso itse uudestaan ja mieti, mitä lukijana saisit niistä irti.) BF-vinkin ongelma taas on minusta lähinnä huono selostus: ainakaan minulle ei selostuksen ja kommenttien perusteella selvinnyt, minkä lukujonon tuo tulostaa, vaan jouduin testaamaan. Sitäpaitsi tuloste ei ole oktaali- vaan kymmenjärjestelmämuodossa, vaikka nimenomaan toisin väität.

BF-vinkin? Enhän minä ole mitään BF-vinkkiä lähettänyt.
Ja se ASM: yksinkertaisia ja helposti tajuttavia tietokoneen hallintaan liittyviä toimintoja...

Metabolix [05.05.2009 17:30:10]

#

janijohannes kirjoitti:

BF-vinkin? Enhän minä ole mitään BF-vinkkiä lähettänyt.

Oletpas.

lainaus:

Ja se ASM: yksinkertaisia ja helposti tajuttavia tietokoneen hallintaan liittyviä toimintoja...

En löytänyt, taitaa olla jo aika vanha? Mutta eipä nyt puhuta täällä näistä enempää; kullakin vinkillä on oma keskustelunsa, ja muusta voi tietysti puhua muualla kuin vinkkien kommenteissa.

ByteMan [06.05.2009 23:43:38]

#

no juu, ku en php:stä kauheasti ole perillä ni aattelin vetästä sen kokeiltavaks copy+pastella... ilmeisesti mikrobitin palvelimilla on jotain php:n upottamista html(tai se tosin taitaa olla xml) tiedoston sisään..
kun tarkastelee tuon avattavan sivun lähdekoodia(sen joka varsinaisesti kutsuu muokkausfunktiota) niin koodi katkeaa <body> kohtaan
eli johtuuko asia mikrobitin palvelimista vai minusta:
http://koti.mbnet.fi/lordi6/muokkauskoodinkokeilu/

Metabolix [07.05.2009 11:08:39]

#

Näköjään PHP-kooditagit muuttavat merkinnän "&$" muotoon "&&#36;", joten tämän korjaamista odotellessa joudut itse muuttamaan nuo takaisin.

ByteMan [07.05.2009 20:37:22]

#

kiitän
edit: ..vaikka nyt ainoa mitä kävi on se, että se lataa kauemmin -.-

Antti Laaksonen [07.05.2009 20:54:07]

#

Nyt merkinnän "&$" ei enää pitäisi tuottaa ongelmia PHP-koodeissa.

Metabolix [07.05.2009 22:09:21]

#

Korjasin koodista vielä yhden virheen: se ei tunnistanut \r-merkkiä rivinvaihdoissa vaan merkitsi ne virheiksi. En tullut ajatelleeksi asiaa koodia tehdessäni, mutta se tuli onneksi ilmi, kun tarkistin, että ByteManin käyttämä testikoodi toimii.

Ja sehän toimi. Ehkäpä MBNetin palvelimessa (sen PHP-versiossa) on jokin puute.

ajv [08.05.2009 08:01:18]

#

Aika mielenkiintoinen ja hyvä vinkki. Ei ihan jokaiselta webbikoodarilta tälläistä syntyis, mutta ehkä tämän pohjalta :)

jyrama [20.05.2009 17:43:59]

#

yksinkertaisesti hieno

kazper [23.05.2009 22:09:34]

#

Kiitos tästä, tarvitsin juuri tuota.

pr0l3 [23.05.2009 23:37:22]

#

wow upea
joko se kohta tulee putkaan?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta