Willkommen in der Webstatt Zum Webstatt Blog und Stories
fish fish am 24.01.07 23:16

highlight_string gibt <font color="#00000"> aus. ich mag aber den font tag aus religiösen gründen nicht verwenden. kann ich das irgentwie auf <span style="color: #000"> umstellen? oder muss ich das meinen hoster machen lassen?

netcup.de Warum gibt es hier Werbung?
der_nic der_nic am 25.01.07 00:17

könntest dir auch eine eigene Funktion dafür schreiben...

fish fish am 25.01.07 09:18

habe gerade was nettes gefunden, leider funkioniert es bei mir nicht richtig

Michael Michael am 25.01.07 14:04

Nicht schön oder schnell aber funktioniert:

du ersetzt einfach per str_replace <font color="#00000"> mit <span...

also etwa so:
ob_start();
highlight_string($data);
$output = ob_get_contents();
ob_end_flush();
$output = str_replace('<font color="#00000">','<span class="blubb">',$output);


Damit es etwas schöner ist, könntest du die Such- und Ersetzmuster in je einem Array speichern und der Funktion übergeben.

Viele Grüße,
Michael

Snake am 25.01.07 16:05

ich möchte an dieser stelle einmal auf den 2. parameter von highlight_string verweisen.
abgesehen davon ist das ob_end_flush() mit einem ob_end_clean() zu ersetzen, sollte man diese schreibweise vorziehen

Franky Franky am 25.01.07 18:08

*hust* wbb ^^
<?
function codeformat($code, $mode) {
global $tpl, $phpversion, $style, $lang, $filename;

if ($mode == "php") {
$phptags = 0;
$code = $this->stripSlashes($code);

if (!wbb_strpos($code, "<?") && wbb_substr($code, 0, 2) != "<?") {
$phptags = 1;
$code = "<?php ".wbb_trim($code)." ?>";
}
ob_start();
$oldlevel = error_reporting(0);
highlight_string($code);
error_reporting($oldlevel);
$buffer = ob_get_contents();
ob_end_clean();

$buffer = str_replace("<code>", "", $buffer);
$buffer = str_replace("</code>", "", $buffer);

if ($phptags == 1) {
if (version_compare($phpversion, "4.3.0") == -1 || version_compare($phpversion, "5.0.5") >= 0) $buffer = preg_replace("/([^\\2]*)(&lt;\?php&nbsp;)(.*)(&nbsp;.*\?&gt;)([^\\4]*)/si", "\\1\\3\\5", $buffer);
else if (version_compare($phpversion, "5.0.0RC1") == -1) $buffer = preg_replace("/([^\\2]*)(&lt;\?php )(.*)( .*\?&gt;)([^\\4]*)/si", "\\1\\3\\5", $buffer);
else {
$buffer = preg_replace("/([^\\2]*)(&lt;\?php )(.*)(\?&gt;)([^\\4]*)/si", "\\1\\3\\5", $buffer);
}
}

$buffer = preg_replace("/<font color=\"([^\"]*)\">/i", "<span style=\"color: \\1\">", str_replace("</font>", "</span>", $buffer));
if ($phptags == 1 && version_compare($phpversion, "4.3.0") != -1) $buffer = str_replace("<font</span>", "", $buffer);
$buffer = preg_replace("/<span style=\"([^\"]*)\">/i", "<span style='\\1'>", $buffer);
$buffer = str_replace("\"", "&quot;", $buffer);
$buffer = str_replace("{", "{", $buffer);
$buffer = str_replace("}", "}", $buffer);
$buffer = str_replace("\n", "", $buffer);
$buffer = str_replace("<br />", "\n", $buffer);

$linecount = wbb_substr_count($buffer, "\n") + 1;
$height = ($style['smallfontsize'] + 3) * $linecount + 50;

if ($this->linenumbers == 1) $linenumbers = $this->makeLineNumbers($buffer);
else $linenumbers = '';

eval("\$code = \"".$tpl->get("codephptag")."\";");
}
else {
$code = $this->stripSlashes($code);
$code = htmlconverter($code);
//$code = str_replace(" ", "&nbsp;", $code);
//$code = nl2br($code);

$code = str_replace("{", "{", $code);
$code = str_replace("}", "}", $code);

$linecount = wbb_substr_count($code, "\n") + 1;
$height = ($style['smallfontsize'] + 3) * $linecount + 50;

if ($this->linenumbers == 1) $linenumbers = $this->makeLineNumbers($code);
else $linenumbers = '';

eval("\$code = \"".$tpl->get("codetag")."\";");
}

return $code;
}
?>


kannst zwar net so 1:1 benutzen, aber steht schonmal ne menge drin, die man benutzen kann... die globalen variablen sind selbsterklärend denke ich :)

fish fish am 25.01.07 18:55

danke :-D

sili sili am 27.01.07 16:40

Fish: Benutzt du denn noch kein PHP5? ;)

fish fish am 27.01.07 17:03

ich weiss nicht, ich glaube aber nicht. oder?

sili sili am 27.01.07 17:07

Quote
Original von fish
ich weiss nicht, ich glaube aber nicht. oder?


Hm. Kann ich dir auch nicht sagen, steht ja nirgends... :baby:

Michael_Genf am 28.01.07 12:06

Quote
Original von Snake
ich möchte an dieser stelle einmal auf den 2. parameter von highlight_string verweisen.
abgesehen davon ist das ob_end_flush() mit einem ob_end_clean() zu ersetzen, sollte man diese schreibweise vorziehen


Mit dem zweiten Parameter hast du vollkommen Recht.
Wenn ob_get_contents richtig funktioniert, sollte es keinen Unterschied machen ob in diesem ob_end_clean,ob_end_flush oder gar nichts verwendet wird.

Nur um es noch einmal klarzustellen, die Variante mit dem zweiten Parameter von highlight_string ist in jedem Fall vorzuziehen aber die Funktionsweise des anderen nur angedeutet.

// edit

Da steht doch ganz oben ganz fett PHP Version 4.4.4
Intuitiv würde ich sagen, fish hat kein PHP5

// edit2

Folgt daraus, dass du auch kein auf PHP5 basierendes OOP Tutorial benötigst?

sili sili am 28.01.07 12:13

Quote
Original von Michael_Genf
Da steht doch ganz oben ganz fett PHP Version 4.4.4
Intuitiv würde ich sagen, fish hat kein PHP5


Also mein Beitrag war von Ironie getränkt, natürlich ist PHP 4.4.4 kein PHP5. :)
Meine Frage war eher daraus ausgelegt, dass PHP5 bereits von Haus aus kein <font ...> sondern <span style="color: ..."> benutzt.

fish fish am 28.01.07 12:28

Quote
Original von Michael_Genf
Folgt daraus, dass du auch kein auf PHP5 basierendes OOP Tutorial benötigst?


naja ... am besten zweigleisig :-) also 444 und 5^^

abgesehen davon bin ich wohl zu blöde zu verstehen was du mit dem "zweiten parameier" gemeint ist. kann mir das mal jemand erklären? highlight_string($text, ZWEITER_PARAMETER)oder wie?

Franky Franky am 28.01.07 13:05

<?
highlight_string('<?php phpinfo(); ?>');
// oder
echo highlight_string('<?php phpinfo(); ?>', true);
?>


du verstehen mich? ;)

fish fish am 28.01.07 14:02

ich verstehs nicht. was macht da jetzt en unterscheid in der ausgabe?

nuit nuit am 28.01.07 14:23

ich wüsste nicht wo der 2 Parameter herkommen soll....
in der englischen doku steht er nicht und in der Deutschen erst reht net???

also, wenn du bei der deutschen ein bisschen runterscrollst und die Comments dazu anschaust, dann stößt du auf das:
<?php

/*

These classes are used for highlighting, happy css-ing:

.phpdefault { color:#0000BB; font-weight: bold;}
.phpkeyword { color:#007700; font-weight: bold;}
.phpstring { color:#DD0000; font-weight: normal;}
.phpcomment { color:#FF8000; font-weight: normal;}

*/

/**
* Highlights PHP-source snippets with and without php-tags, inserts class definitions on request
*
* Strips <code> and <span color:black>, removes empty spans
*
* @param string $source Source to highlight
* @param boolean $classes, true links source elements to classes
* @return string
*/
function php_highlight($source, $classes = false)
{
if (version_compare( phpversion(), "5.0.0", "<")) return "PHP 5 required";

$r1 = $r2 = '##';

// adds required PHP tags (at least with vers. 5.0.5 this is required)
if ( strpos($source,' ?>') === false ) // xml is not THAT important ;-)
{
$source = "<?php ".$source." ?>";
$r1 = '#&lt;\?.*?(php)?.*?&nbsp;#s';
$r2 = '#\?&gt;#s';
}
elseif (strpos($source,'<? ') !== false)
{
$r1 = '--';
$source = str_replace('<? ','<?php ',$source);
}

$source = highlight_string($source,true);

if ($r1 =='--') $source = preg_replace('#(&lt;\?.*?)(php)?(.*?&nbsp;)#s','\\1\\3',$source);

$source = preg_replace (array ( '/.*<code>\s*<span style="color: #000000">/', //
'#</span>\s*</code>#', // <code><span black>
$r1, $r2, // php tags
'/<span[^>]*><\/span>/' // empty spans
),'',$source);

if ($classes) $source = str_replace( array('style="color: #0000BB"','style="color: #007700"',
'style="color: #DD0000"','style="color: #FF8000"'),
array('class="phpdefault"','class="phpkeyword"',
'class="phpstring"','class="phpcomment"',),$source);

return $source;
}

echo '<p>Some tests:</p><p>';
echo php_highlight('<?php $test = new func("Text"); /* regular tags, use classes */ ?>',true),'<br />';
echo 'Inline code: ',php_highlight('<? $test = new func("Text"); /* short tags */ ?>'),
' works without or ',php_highlight('define (\'WITH_CLASSES\',\' too\'); /* no tags */',true),'<br />';
echo php_highlight('$test = new func("Text"); /* no tags, no classes */'),'<br />';
echo '</p><p>You are running PHP: '.phpversion().'</p>';

?>

das ist glaube ich recht hilfreich ;)

edit: jetzt hab ich es verstanden:
im prinzip macht der 2 Parameter nur, dass er was zurückgibt...anders gibt highlight_string einfach aus, wenn du aber den 2 Parameter auf true setzt, dann gibt er es als string zurück und du musst nicht mit ob_end_clean und so rumhantieren
und ja er ist dokumentiert...hat wohl der deutsche übersetzer geschlafen ;)

sili sili am 28.01.07 14:29

Quote
Original von nuit
ich wüsste nicht wo der 2 Parameter herkommen soll....
in der englischen doku steht er nicht und in der Deutschen erst reht net???


Und ob das steht ;)

Quote
mixed highlight_string ( string str [, bool return] )

The highlight_string() function outputs a syntax highlighted version of str using the colors defined in the built-in syntax highlighter for PHP.

If the second parameter return is set to TRUE then highlight_string() will return the highlighted code as a string instead of printing it out. If the second parameter is not set to TRUE then highlight_string() will return TRUE on success, FALSE on failure.

fish fish am 28.01.07 16:51

Quote
Original von nuit
das ist glaube ich recht hilfreich ;)


PHP5 required :-(

function hilighte_den_php_code($text) {
highlight_string($text, TRUE);
$text = str_replace('<font color="','<span style="color:',$text');
$text = str_replace('">',';">',$text');
$text = str_replace('</font>',</span>',$text');
return $text;
}


dann müsste das ja so gehhen. warum gehts nicht? arggh

Al3x0r Al3x0r am 28.01.07 16:54

function hilighte_den_php_code($text) {
highlight_string($text, TRUE);
$text = str_replace('<font color="','<span style="color:',$text);
$text = str_replace('">',';">',$text);
$text = str_replace('</font>','</span>',$text);
return $text;
}


sieht man doch schon daran wie der Code eingefärbt wird... ein ' zu viel

mfg Alex

edit:// waren doch ein paar mehr ;D

sili sili am 28.01.07 16:56

function hilighte_den_php_code($text) {
$text = highlight_string($text, TRUE); // <--------
$text = str_replace('<font color="', '<span style="color:', $text);
$text = str_replace('">', ';">', $text);
$text = str_replace('</font>', '</span>', $text);
return $text;
}

Wasili am 28.01.07 16:57

highlight_string() gibt was zurück...

function hilighte_den_php_code($text) {
$text = highlight_string($text, TRUE);
$text = str_replace('<font color="','<span style="color:',$text);
$text = str_replace('">',';">',$text);
$text = str_replace('</font>','</span>',$text);
return $text;
}


Edit: Mist... da war wer schneller *g*

fish fish am 28.01.07 18:41

danke das funktioniert jetzt. super!

ich habe jetzt noch eine frage: ist es möglich, wenn in dem php-code eine funktion vorkommt, also zum beispiel highlight_string, dass dann automatisch ein link zur entsprechenden manualseite gesetzt wird? müsste ich da alle funktionsnamen mit hand eintragen oder geht das vll irgentwei anders?

BNightSpeeder am 28.01.07 18:50

Wenn es in dieser Klasse möglich ist mit CSS-Eigenschaften den Text zu formatieren:

http://labs.fah-q.org/lib/php/class.php-highlight.php

Und in der CSS Datei folgendes steht:

.php .function {
font-weight: bolder;
color: #a3a;
}


Dan wir das gehen. ;)

Sieh dir mal die Zeilen ab 119 an.

fish fish am 28.01.07 19:12

schöne klasse. wie benutz ich die? // muss ich die benutzen oder geht das auch anders?

BNightSpeeder am 28.01.07 19:14

Das Versuch ich auch schon seit ein paar Tagen herauszufinden. Aber irgendwie will die bei mir nicht.

Franky Franky am 28.01.07 20:07

mensch: http://www.kosmokrator.com/download/php/show_source_.php --> ist mit linkumwandlung und so ;)

übrigens, schöne klasse für anti alising linien für bilder in php:
http://www.kosmokrator.com/download/php/antialias.php

fish fish am 28.01.07 20:31

danke! ich nehme mal an die linien haben nix mit dem thema zu tu oder ;-P

so für das archiv oder so.. das ist bei mir jetzt rausgekommen:

function SyntaxHighlight($text) {
$code = highlight_string( $text, true );
$code = str_replace('<font color="#FF9900">', '<span class="comment">', $code);
$code = str_replace('<font color="#0000CC">', '<span class="default">', $code);
$code = str_replace('<font color="#000000">', '<span class="html">', $code);
$code = str_replace('<font color="#006600">', '<span class="keyword">', $code);
$code = str_replace('<font color="#CC0000">', '<span class="string">', $code);
$code = str_replace('</font>', '</span>', $code);

$code = preg_replace( '{([\w]+)(\s*</span><span\s+class="keyword">|)(\s*\()}',
'<a target="_new" class="keyword_link" title="PHP Handbuch zu $1 öffnen" href="http://www.php.net/$1">$1</a>$2$3', $code );
$arrHTML = explode( "<br />", $code );
$count = count( $arrHTML );

// prepare html...
$html .= "<br />\n";
$html .= "<table>\n<tr>\n";
$html .= "<td>";

// line numbers...
for( $i = 1; $i <= $count; $i++ ) {
$html .= $i."<br />";
}
$html .= "</td>\n<td>\n";

// code lines...
foreach( $arrHTML as $line ) {
$html .= $line."<br />\n";
}

$html .= "</td>\n</tr>\n</table>\n";

return $html;
}

BNightSpeeder am 29.01.07 14:24

Mal eine veränderte Version von mir die dan fast genau so aussieht wie im WBB.

<?php

function SyntaxHighlight($text) {

$zeilenhoehe = "16"; // Die Höhe einer Zeile in px

$code = highlight_string( $text, true );
$code = str_replace('<font color="#FF9900">', '<span class="comment">', $code);
$code = str_replace('<font color="#0000CC">', '<span class="default">', $code);
$code = str_replace('<font color="#000000">', '<span class="html">', $code);
$code = str_replace('<font color="#006600">', '<span class="keyword">', $code);
$code = str_replace('<font color="#CC0000">', '<span class="string">', $code);
$code = str_replace('</font>', '</span>', $code);

$code = preg_replace( '{([\w]+)(\s*</span><span\s+class="keyword">|)(\s*\()}',
'<a target="_new" class="keyword_link" title=\'PHP Handbuch zu "$1" öffnen\' href="http://www.php.net/$1">$1</a>$2$3', $code );
$arrHTML = explode( "<br />", $code );
$count = count( $arrHTML );
$zeilen = $count*$zeilenhoehe-$zeilenhoehe*$count/5;

// prepare html...
$html .= "<br />\n";
$html .= "<div class=\"php_code_div\" style=\"height: ".$zeilen."px\">";
$html .= "<table class=\"php_code\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n";
$html .= "<td nowrap=\"nowrap\" colspan=\"2\" class=\"php_code_title\">php:</td></tr><tr>";
$html .= "<td nowrap=\"nowrap\" class=\"php_code_number\">";

// line numbers...
for( $i = 1; $i <= $count; $i++ ) {
$html .= $i.':</br>';
}
$html .= "</td>\n<td nowrap=\"nowrap\" class=\"php_code_code\">\n";

// code lines...
foreach( $arrHTML as $line ) {
$html .= $line."<br />\n";
}

$html .= "</td>\n</tr>\n</table></div>\n";

return $html;
}
?>
<style type="text/css">
<!--
.php_code {
width: 100%;
}

.php_code_div {
overflow: auto;
width: 100%;
}

.php_code_title {
height: 20px;
background-color: #DBDBDB;
color: #6a6a6a;
margin: 0 auto;
font-size: 10px;
font-family: Verdana;
padding-left: 5px;
}

.php_code_number {
padding: 7px;
width: auto;
border: 1px solid #DBDBDB;
color: #6a6a6a;
text-align: right;
margin: 0 auto;
font-size: 11px;
font-family: Arial;
}

.php_code_code {
padding: 7px;
width: 98%;
border: 1px solid;
color: #DBDBDB;
margin: 0 auto;
font-size: 11px;
font-family: Arial;
}
-->
</style>


Mfg. BNS

sili sili am 03.02.07 22:40

Hier auch ein kleines Skriptchen von mir welches auf den Token Funktionen von PHP aufbaut. Mit Befehlsverlinkung.
Noch etwas aufräumen und dann sollte das Ding auch mal auf meiner Seite veröffentlich werden ;)

Kritik gerne.


<?php


// =============================================================================
// GIBT DEN UEBERGEBENEN PHP CODE FARBLICH ANGEPASST ZURUECK
// =============================================================================

function my_highlight_string($code)
{



// ==============================================================================
// ERGAENZENDE FUNKTIONEN
// ==============================================================================


// ------------------------------------------------------------------------------
// GIBT DIE *SELBER* DEFINIERTEN FUNKTIONEN ZURUECK
// ------------------------------------------------------------------------------

if (!function_exists('my_get_defined_functions')) {
function my_get_defined_functions()
{
$funktionen = get_defined_functions();
return $funktionen['user'];
}
}


// ------------------------------------------------------------------------------
// SUCHT DEN PASSENDEN SCHLUESSEL ZUM TOKEN UND GIBT IHN ZURUECK
// ------------------------------------------------------------------------------

if (!function_exists('get_array_key')) {
function get_array_key($id, $a_konstanten)
{
foreach ($a_konstanten as $key => $wert) {
if (in_array($id, $wert)) {
return $key;
}
}
return false;
}
}




// ==============================================================================
// VORBEREITUNG
// ==============================================================================

// Farben definieren
$a_farben = array( // STANDARDFARBEN
'string' => ini_get('highlight.string'), // #DD0000 rot
'comment' => ini_get('highlight.comment'), // #FF8000 orange
'keyword' => ini_get('highlight.keyword'), // #007700 gruen
'default' => ini_get('highlight.default'), // #0000BB blau
'html' => ini_get('highlight.html') // #000000 schwarz
);

// Token Konstanten in Gruppen fuer Farbbestimmung einteilen
$a_konstanten = array(
'string' => array(T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE),
'comment' => array(T_COMMENT, T_DOC_COMMENT),
'default' => array(T_CLOSE_TAG, T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO, T_VARIABLE, T_STRING, T_LNUMBER, T_WHITESPACE, T_CLASS_C),
'keyword' => array(T_ABSTRACT, T_ARRAY, T_ARRAY_CAST, T_AS, T_BOOLEAN_AND, T_BOOLEAN_OR, T_BOOL_CAST, T_BREAK, T_CASE, T_CATCH, T_CLASS, T_CLONE, T_CONCAT_EQUAL, T_CONTINUE, T_DEFAULT, T_DOUBLE_ARROW, T_DOUBLE_CAST, T_ECHO, T_ELSE, T_ELSEIF, T_EMPTY, T_ENDDECLARE, T_ENDFOR, T_ENDFOREACH, T_ENDIF, T_ENDSWITCH, T_ENDWHILE, T_END_HEREDOC, T_EXIT, T_EXTENDS, T_FINAL, T_FOREACH, T_FUNCTION, T_GLOBAL, T_IF, T_INC, T_INCLUDE, T_INCLUDE_ONCE, T_INSTANCEOF, T_INT_CAST, T_ISSET, T_IS_EQUAL, T_IS_IDENTICAL, T_IS_NOT_IDENTICAL, T_IS_SMALLER_OR_EQUAL, T_NEW, T_OBJECT_CAST, T_OBJECT_OPERATOR, T_PAAMAYIM_NEKUDOTAYIM, T_PRIVATE, T_PROTECTED, T_PUBLIC, T_REQUIRE, T_REQUIRE_ONCE, T_RETURN, T_SL, T_SL_EQUAL, T_SR, T_SR_EQUAL, T_START_HEREDOC, T_STATIC, T_STRING_CAST, T_THROW, T_TRY, T_UNSET_CAST, T_VAR, T_WHILE, T_LOGICAL_OR, T_UNSET, T_LIST, T_LOGICAL_AND, T_IS_NOT_EQUAL, T_IS_GREATER_OR_EQUAL, T_FOR, T_MUL_EQUAL, T_DIV_EQUAL, T_SWITCH, T_PLUS_EQUAL, T_DO),
'html' => array(T_INLINE_HTML)
);

// Formatierung von Farbangaben und Links
$format_highlighting = '<span style="color:%s;">%s</span>';
$format_link = '<a href="http://php.net/function.%s" class="php" title="%s()">%s</a>';




// ==============================================================================
// SCRIPT
// ==============================================================================


$php = '';
$i = 0;

$a_token = token_get_all($code);

foreach($a_token as $token)
{
if (is_string($token)) {
// 1 Buchstaben Token z.B. ( { [ ; usw.
$php .= sprintf($format_highlighting, $a_farben['keyword'], htmlspecialchars($token));

} else {
// Token Inhalt aufteilen
list($id, $text) = $token;

// Formatierung beibehalten
$text = htmlspecialchars($text);
$text = str_replace(' ', ' &nbsp;', $text);

// entsprechenden Schluessel fuer Farbauswahl auslesen
$key = get_array_key($id, $a_konstanten);

if ($id == T_STRING && ($a_token[$i + 1] == '(' || $a_token[$i + 2] == '(') && function_exists($text) && !in_array($text, my_get_defined_functions())) {
// Manual Link
$php .= sprintf($format_link, $text, $text, $text);
} else {
// normale Ausgabe
$php .= sprintf($format_highlighting, $a_farben[$key], $text);
}
}

// Zaehler fuer Manual Verlinkung
$i++;
}

return str_replace("\n", '<br />', $php);
}

?>

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt