<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=134.3.57.182</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=134.3.57.182"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/134.3.57.182"/>
	<updated>2026-05-06T20:40:31Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Postgres_Datenbank&amp;diff=20347</id>
		<title>Postgres Datenbank</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Postgres_Datenbank&amp;diff=20347"/>
		<updated>2014-08-07T14:18:49Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cronjob zum Sichern ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Im Userverzeichnis eine Datei mit dem Namen .pgpass und den Rechten 600 (chmod) anlegen&lt;br /&gt;
* Die Datei enthält die Zugangsdaten, pg_dump sucht automatisch nach dieser Datei.&lt;br /&gt;
** Inhalt der Datei: &lt;br /&gt;
 *:*:database_name:database_user:password&lt;br /&gt;
* Backupverzeichnis anlegen &lt;br /&gt;
 mkdir  db_backups&lt;br /&gt;
* Batchfile anlegen &lt;br /&gt;
db_backup.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
DATUM=`date +%d.%m.%Y_%a%H-%M`&lt;br /&gt;
MYSQLPATH=/usr/bin/&lt;br /&gt;
BACKUPDIR=$HOME/db_backups/&lt;br /&gt;
DBUSER=schilder&lt;br /&gt;
DBNAME=schilder_tool&lt;br /&gt;
&lt;br /&gt;
#dbpassword is used from .pgpass in user directory&lt;br /&gt;
/usr/local/pgsql/bin/pg_dump -Fp -b -U $DBUSER $DBNAME &amp;gt; ${BACKUPDIR}schilder_tool-$DATUM.sql&lt;br /&gt;
&lt;br /&gt;
# delete older files than 4 days&lt;br /&gt;
find $BACKUPDIR -type f -mtime +4 -exec rm {} \;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cronjob einrichten ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Linux - Cronjobs]]&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Postgres_Datenbank&amp;diff=20346</id>
		<title>Postgres Datenbank</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Postgres_Datenbank&amp;diff=20346"/>
		<updated>2014-08-07T14:17:45Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Cronjob zum Sichern ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Im Userverzeichnis eine Datei mit dem Namen .pgpass und den Rechten 600 (chmod) anlegen&lt;br /&gt;
* Die Datei enthält die Zugangsdaten, pg_dump sucht automatisch nach dieser Datei.&lt;br /&gt;
** Inhalt der Datei: &lt;br /&gt;
 *:*:database_name:database_user:password&lt;br /&gt;
* Backupverzeichnis anlegen &lt;br /&gt;
 mkdir  db_backups&lt;br /&gt;
* Batchfile anlegen &lt;br /&gt;
db_backup.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
DATUM=`date +%d.%m.%Y_%a%H-%M`&lt;br /&gt;
MYSQLPATH=/usr/bin/&lt;br /&gt;
BACKUPDIR=$HOME/db_backups/&lt;br /&gt;
DBUSER=schilder&lt;br /&gt;
DBNAME=schilder_tool&lt;br /&gt;
&lt;br /&gt;
#dbpassword is used from .pgpass in user directory&lt;br /&gt;
/usr/local/pgsql/bin/pg_dump -Fp -b -U $DBUSER $DBNAME &amp;gt; ${BACKUPDIR}schilder_tool-$DATUM.sql&lt;br /&gt;
&lt;br /&gt;
# delete older files than 4 days&lt;br /&gt;
find $BACKUPDIR -type f -mtime +4 -exec rm {} \;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cronjob einrichten ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Crontab]]&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Postgres_Datenbank&amp;diff=20345</id>
		<title>Postgres Datenbank</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Postgres_Datenbank&amp;diff=20345"/>
		<updated>2014-08-07T14:08:25Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: Die Seite wurde neu angelegt: „Cronjob zum Sichern  * Im Userverzeichnis eine Datei mit dem Namen .pgpass und den Rechten 600 (chmod) anlegen * Die Datei enthält die Zugangsdaten, pg_dump such…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cronjob zum Sichern&lt;br /&gt;
&lt;br /&gt;
* Im Userverzeichnis eine Datei mit dem Namen .pgpass und den Rechten 600 (chmod) anlegen&lt;br /&gt;
* Die Datei enthält die Zugangsdaten, pg_dump sucht automatisch nach dieser Datei.&lt;br /&gt;
** Inhalt der Datei: &lt;br /&gt;
 *:*:database_name:database_user:password&lt;br /&gt;
* Backupverzeichnis anlegen &lt;br /&gt;
 mkdir  db_backups&lt;br /&gt;
* Batchfile anlegen &lt;br /&gt;
db_backup.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
DATUM=`date +%d.%m.%Y_%a%H-%M`&lt;br /&gt;
MYSQLPATH=/usr/bin/&lt;br /&gt;
BACKUPDIR=$HOME/db_backups/&lt;br /&gt;
DBUSER=schilder&lt;br /&gt;
DBNAME=schilder_tool&lt;br /&gt;
&lt;br /&gt;
#dbpassword is used from .pgpass in user directory&lt;br /&gt;
/usr/local/pgsql/bin/pg_dump -Fp -b -U $DBUSER $DBNAME &amp;gt; ${BACKUPDIR}schilder_tool-$DATUM.sql&lt;br /&gt;
&lt;br /&gt;
# delete older files than 4 days&lt;br /&gt;
find $BACKUPDIR -type f -mtime +4 -exec rm {} \;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TripMaps&amp;diff=20342</id>
		<title>TripMaps</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TripMaps&amp;diff=20342"/>
		<updated>2014-07-29T06:32:59Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: Die Seite wurde neu angelegt: „== Einleitung == TripMaps App ist eine Smartphone App um GPS gesteuerte Outdoor Rätsel - Touren oder Führungen zu realisieren.  == Basis Infos ==“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
TripMaps App ist eine Smartphone App um GPS gesteuerte Outdoor Rätsel - Touren oder Führungen zu realisieren.&lt;br /&gt;
&lt;br /&gt;
== Basis Infos ==&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_Snippets&amp;diff=20341</id>
		<title>JQuery - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_Snippets&amp;diff=20341"/>
		<updated>2014-07-25T08:29:43Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Attribute vorhanden? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nützliche jQuery Schnipsel&lt;br /&gt;
== Grundgerüst zum testen ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta content=&amp;quot;text/html; charset=ISO-8859-1&amp;quot; http-equiv=&amp;quot;content-type&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Test&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;	&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function newFunc(myParam){&lt;br /&gt;
	alert(&amp;#039;hello world&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Testpage&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
[[JavaScript - Snippets]]&lt;br /&gt;
&lt;br /&gt;
http://css-tricks.com/snippets/jquery/&lt;br /&gt;
&lt;br /&gt;
http://www.jquery4u.com/&lt;br /&gt;
&lt;br /&gt;
== Each ==&lt;br /&gt;
 [[jQuery - Nested each / verschachtelte Liste]]&lt;br /&gt;
&lt;br /&gt;
http://www.jquery4u.com/jquery-functions/jquery-each-examples/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//DOM ELEMENTS&lt;br /&gt;
$(&amp;quot;div&amp;quot;).each(function(index, value) { &lt;br /&gt;
    console.log(&amp;#039;div&amp;#039; + index + &amp;#039;:&amp;#039; + $(this).attr(&amp;#039;id&amp;#039;)); &lt;br /&gt;
});&lt;br /&gt;
//outputs the ids of every div on the web page&lt;br /&gt;
//ie - div1:header, div2:body, div3:footer&lt;br /&gt;
&lt;br /&gt;
//ARRAYS&lt;br /&gt;
var arr = [ &amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, &amp;quot;five&amp;quot; ];&lt;br /&gt;
jQuery.each(arr, function(index, value) {&lt;br /&gt;
       console.log(this);&lt;br /&gt;
       return (this != &amp;quot;three&amp;quot;); // will stop running after &amp;quot;three&amp;quot;&lt;br /&gt;
   });&lt;br /&gt;
//outputs: one two three&lt;br /&gt;
&lt;br /&gt;
//OBJECTS&lt;br /&gt;
var obj = { one:1, two:2, three:3, four:4, five:5 };&lt;br /&gt;
    jQuery.each(obj, function(i, val) {&lt;br /&gt;
       console.log(val);&lt;br /&gt;
    });&lt;br /&gt;
//outputs: 1 2 3 4 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== jQuery Countdown Scripts ===&lt;br /&gt;
http://www.tripwiremagazine.com/2012/01/jquery-countdown-scripts.html&lt;br /&gt;
&lt;br /&gt;
== Formulare ==&lt;br /&gt;
Siehe auch [[JQuery - AJAX]]&lt;br /&gt;
=== GET-Variable in URL auslesen ===&lt;br /&gt;
Diese muß extrahiert werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&lt;br /&gt;
&lt;br /&gt;
Quelle: http://jquery-howto.blogspot.de/2009/09/get-url-parameters-values-with-jquery.html (Zugriff: 2013/01)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Read a page&amp;#039;s GET URL variables and return them as an associative array.&lt;br /&gt;
function getUrlVars()&lt;br /&gt;
{&lt;br /&gt;
    var vars = [], hash;&lt;br /&gt;
    var hashes = window.location.href.slice(window.location.href.indexOf(&amp;#039;?&amp;#039;) + 1).split(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
    for(var i = 0; i &amp;lt; hashes.length; i++)&lt;br /&gt;
    {&lt;br /&gt;
        hash = hashes[i].split(&amp;#039;=&amp;#039;);&lt;br /&gt;
        vars.push(hash[0]);&lt;br /&gt;
        vars[hash[0]] = hash[1];&lt;br /&gt;
    }&lt;br /&gt;
    return vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurzform:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function getUrlVars()&lt;br /&gt;
{&lt;br /&gt;
return window.location.href.slice(window.location.href.indexOf(&amp;#039;?&amp;#039;)).split(/[&amp;amp;?]{1}[\w\d]+=/);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf von:&lt;br /&gt;
 http://www.example.com/?me=myValue&amp;amp;name2=SomeOtherValue&lt;br /&gt;
&lt;br /&gt;
ergibt folgendes Array:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;me&amp;quot;    : &amp;quot;myValue&amp;quot;,&lt;br /&gt;
    &amp;quot;name2&amp;quot; : &amp;quot;SomeOtherValue&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Bei mir funktionierte es nicht mit Aufruf ohne Parameter. Dann entsteht nur ein nicht assoziatives Array. Das liegt wahrscheinlich daran, daß JavaScript eigentlich keine assoziativen Arrays kennt. Folgender Aufruf funktioniert aber:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var first = getUrlVars()[&amp;quot;me&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// To get the second parameter&lt;br /&gt;
var second = getUrlVars()[&amp;quot;name2&amp;quot;];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&lt;br /&gt;
&lt;br /&gt;
Etwas älteres Beispiel von: http://www.tutorials.de/javascript-ajax/149174-probleme-mit-dem-auslesen-von-variablen.html (Zugriff 2013/01)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;SCRIPT type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
HTTP_GET_VARS=new Array();&lt;br /&gt;
strGET=document.location.search.substr(1,document.location.search.length);&lt;br /&gt;
if(strGET!=&amp;#039;&amp;#039;)&lt;br /&gt;
    {&lt;br /&gt;
    gArr=strGET.split(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
    for(i=0;i&amp;lt;gArr.length;++i)&lt;br /&gt;
        {&lt;br /&gt;
        v=&amp;#039;&amp;#039;;vArr=gArr[i].split(&amp;#039;=&amp;#039;);&lt;br /&gt;
        if(vArr.length&amp;gt;1){v=vArr[1];}&lt;br /&gt;
        HTTP_GET_VARS[unescape(vArr[0])]=unescape(v);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
function GET(v)&lt;br /&gt;
{&lt;br /&gt;
if(!HTTP_GET_VARS[v]){return &amp;#039;undefined&amp;#039;;}&lt;br /&gt;
return HTTP_GET_VARS[v];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
document.writeln (&amp;#039;Erste Var:&amp;#039; + GET(&amp;#039;text&amp;#039;) + &amp;#039; du&amp;#039;);&lt;br /&gt;
document.writeln (&amp;#039;Zweite Var:&amp;#039; + GET(&amp;#039;text2&amp;#039;) + &amp;#039; da draussen&amp;#039;);&lt;br /&gt;
// --&amp;gt;&lt;br /&gt;
&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fokus auf erstes Input-Feld im Formular setzen ===&lt;br /&gt;
 // focus on the first text input field on the page&lt;br /&gt;
 $(&amp;quot;input[type=&amp;#039;text&amp;#039;]:first&amp;quot;, document.forms[0]).focus();&lt;br /&gt;
&lt;br /&gt;
=== Werte von Formularen auslesen ===&lt;br /&gt;
http://www.beier-christian.eu/blog/weblog/jquery-ausgewahlte-option-aus-select-box-auslesen/&lt;br /&gt;
&lt;br /&gt;
==== Select Boxen ====&lt;br /&gt;
Hinweis, vieles ist natürlich auch mit anderen Elementen möglich.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;obst&amp;quot;&amp;gt;Obst&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;obst&amp;quot; id=&amp;quot;obst&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Orange&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;Apfel&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;Banane&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wert auslesen&lt;br /&gt;
 $(&amp;#039;select#obst&amp;#039;).val();&lt;br /&gt;
&lt;br /&gt;
Text des Wertes auslesen&lt;br /&gt;
 $(&amp;#039;select#obst :selected&amp;#039;).text();&lt;br /&gt;
&lt;br /&gt;
Text mehrerer gewählter Optionen ausgeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;select#obst :selected&amp;#039;).each(function(i, option) {&lt;br /&gt;
  // Verarbeitung der Optionen&lt;br /&gt;
  alert(option.value + &amp;#039; &amp;#039; + option.text);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispiel: Alle gewählten Werte bei Veränderung in ein div (id=message) schreiben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;quot;select&amp;quot;).change(function () {&lt;br /&gt;
  var str = &amp;quot;&amp;quot;;&lt;br /&gt;
  $(&amp;quot;select option:selected&amp;quot;).each(function () {&lt;br /&gt;
    str += $(this).text();&lt;br /&gt;
  });&lt;br /&gt;
  $(&amp;quot;div#message&amp;quot;).text(str);&lt;br /&gt;
}).change(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Checkboxen ====&lt;br /&gt;
Links:&lt;br /&gt;
http://technosophos.com/node/223 (Zugriff 07-2012)&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Checked ? Returns a boolean, true if checked, false otherwise&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).is(&amp;#039;:checked&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Check checkbox - this sets the attribute checked=&amp;quot;checked&amp;quot;&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).attr(&amp;#039;checked&amp;#039;,&amp;#039;checked&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Uncheck checkbox (right way)&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).removeAttr(&amp;#039;checked&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Check / Uncheck everything&lt;br /&gt;
&lt;br /&gt;
// Check anything that is not already checked:&lt;br /&gt;
jQuery(&amp;#039;:checkbox:not(:checked)&amp;#039;).attr(&amp;#039;checked&amp;#039;, &amp;#039;checked&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
// Remove the checkbox&lt;br /&gt;
jQuery(&amp;#039;:checkbox:checked&amp;#039;).removeAttr(&amp;#039;checked&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kleines Hide Show Script wenn eine Checkbox ausgewählt ist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
			$(&amp;quot;input[name=&amp;#039;calib_as_offered&amp;#039;]&amp;quot;).change(function() {&lt;br /&gt;
				if ($(&amp;quot;input[name=&amp;#039;calib_as_offered&amp;#039;]&amp;quot;).is(&amp;quot;:checked&amp;quot;)){&lt;br /&gt;
					$(&amp;quot;#contact_address&amp;quot;).show();&lt;br /&gt;
					$(&amp;quot;#offer_nr_wrap&amp;quot;).show();&lt;br /&gt;
				} &lt;br /&gt;
				else {&lt;br /&gt;
					$(&amp;quot;#contact_address&amp;quot;).hide();&lt;br /&gt;
					$(&amp;quot;#offer_nr_wrap&amp;quot;).hide();					&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Radio Buttons ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Change Listener für Radio Buttons&amp;#039;&amp;#039;&amp;#039; (Quelle: http://stackoverflow.com/questions/10167395/how-can-i-attach-a-listener-to-multiple-radio-buttons Zugriff: 2013-08)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;input:radio&amp;#039;).on(&amp;#039;change&amp;#039;, function(){&lt;br /&gt;
    //access value of changed radio group with $(this).val()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quelle der folgenden Beispiele: http://mabraham.de/jquery-radio-buttons-auslesen-und-manipulieren/ (Zugriff 2013-08)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wert (value) einer Radio Group auslesen.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-button-value&amp;#039;).click(function(){&lt;br /&gt;
    alert($(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).val());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button gewählt checked ?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#element&amp;#039;).click(function() {&lt;br /&gt;
   if($(&amp;#039;#radio_button&amp;#039;).is(&amp;#039;:checked&amp;#039;)) { alert(&amp;quot;it&amp;#039;s checked&amp;quot;); }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-button-is-set&amp;#039;).click(function(){&lt;br /&gt;
    alert(typeof $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).val() != &amp;#039;undefined&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button anhand seiner Id auswählen (check)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-checked-by-id&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;#gruppe1&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button über Wert auswählen (check) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-checked-by-value&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;][value=&amp;#039;2&amp;#039;]&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button abwählen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-uncheck&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).removeAttr(&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser ==&lt;br /&gt;
=== Resize des Browserfensters feststellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot; src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
 &lt;br /&gt;
//If the User resizes the window, adjust the #container height&lt;br /&gt;
$(window).bind(&amp;quot;resize&amp;quot;, resizeWindow);&lt;br /&gt;
function resizeWindow( e ) {&lt;br /&gt;
	var newWindowHeight = $(window).height();&lt;br /&gt;
	$(&amp;quot;#container&amp;quot;).css(&amp;quot;min-height&amp;quot;, newWindowHeight );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
});			&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Templates - Vorlagen ==&lt;br /&gt;
=== XHTML 1.0 Template mit jQuery ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;content-type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Title goes here &amp;amp;raquo; Site title here&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Meta Tags --&amp;gt;&lt;br /&gt;
	&amp;lt;base href=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;copyright&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;robots&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;generator&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;expires&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;cache-control&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- Fav icon --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;shortcut icon&amp;quot; href=&amp;quot;/favicon.ico&amp;quot; type=&amp;quot;image/x-icon&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- JavaScript setup --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	/*&amp;lt;![CDATA[*/&lt;br /&gt;
	// add &amp;#039;js&amp;#039; class to root element to nicely allow css that degrades gracefully if js is disabled&lt;br /&gt;
	document.getElementsByTagName(&amp;#039;html&amp;#039;)[0].className = &amp;#039;js&amp;#039;;&lt;br /&gt;
	/*]]&amp;gt;*/&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- CSS --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/screen.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen, projection&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/print.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;print&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!--[if IE]&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/ie-all.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen, projection&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;![endif]--&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
		&amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Title of page goes here&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;h2&amp;gt;Subtitle of page goes here&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end header div --&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;breadcrumbs&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sub directory&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Current page&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end nav div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sidebar link #1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sidebar link #2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;div id=&amp;quot;sub1&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;h3&amp;gt;Title of content&amp;lt;/h3&amp;gt;&lt;br /&gt;
				&amp;lt;p&amp;gt;Begin content here&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div id=&amp;quot;sub2&amp;quot; class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;h3&amp;gt;Title of content&amp;lt;/h3&amp;gt;&lt;br /&gt;
				&amp;lt;p&amp;gt;Begin content here&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end main div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;p&amp;gt;&amp;amp;copy;2XXX company name here. Creative Commons link, your own link, validation, etc.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end footer div --&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;/div&amp;gt;&amp;lt;!-- end container div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/app.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;!-- place Google Analytics code here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== JavaScript nachladen während die Seite schon angezeigt wird ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Add this onDocumentReady function to the end of the jQuery.js file. &lt;br /&gt;
// It MUST be in the jquery file to work correctly.&lt;br /&gt;
$(function(){&lt;br /&gt;
	var scripts = /\?(.*)/, files = [], path = /^.*\//, loaded = 0, count = 0;&lt;br /&gt;
 &lt;br /&gt;
	$(&amp;#039;script&amp;#039;).each(function(){&lt;br /&gt;
		var src = $(this).attr(&amp;#039;src&amp;#039;);&lt;br /&gt;
		if (!scripts.test(src)) return;&lt;br /&gt;
		var pathto = src.match(path);&lt;br /&gt;
		files = files.concat($.map(src.match(scripts).pop().split(&amp;#039;,&amp;#039;), function(e,i){&lt;br /&gt;
			return pathto+e+&amp;#039;.js&amp;#039;&lt;br /&gt;
		}));&lt;br /&gt;
	})&lt;br /&gt;
 &lt;br /&gt;
	count = files.length;&lt;br /&gt;
 &lt;br /&gt;
	$.each(files, function(){&lt;br /&gt;
		$.getScript(this, function(){&lt;br /&gt;
			loaded++;&lt;br /&gt;
			if(loaded == count &amp;amp;&amp;amp; typeof onBackload == &amp;#039;function&amp;#039;)&lt;br /&gt;
				onBackload(loaded)&lt;br /&gt;
		})&lt;br /&gt;
	})&lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * If you have the following script tags:&lt;br /&gt;
 * 	&amp;lt;script src=&amp;quot;/path/to/jquery.min.js?somefile,otherfile.min,thirdfile&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 * 	&amp;lt;script src=&amp;quot;/other/path/foo.js?different.file,final.file&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 * This script will &amp;quot;backload&amp;quot; the following files:&lt;br /&gt;
 * 	/path/to/somefile.js&lt;br /&gt;
 *	/path/to/otherfile.min.js&lt;br /&gt;
 * 	/path/to/thirdfile.js&lt;br /&gt;
 * 	/other/path/different.file.js&lt;br /&gt;
 *	/other/path/final.file.js&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
// And if you declare a function named &amp;quot;onBackload&amp;quot;, it will be fired when all the scripts are loaded&lt;br /&gt;
// This is handy for getting things going once you&amp;#039;re confident your scripts have all been included.&lt;br /&gt;
function onBackload(loaded){&lt;br /&gt;
	alert(&amp;#039;All &amp;#039; + loaded + &amp;#039; files backloaded!&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Manipulation ==&lt;br /&gt;
=== Einfaches Rollover Hide Show Skript ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	/*&amp;lt;![CDATA[*/&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
//var j = jQuery.noConflict();&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    hideAllItems();	&lt;br /&gt;
&lt;br /&gt;
    $(&amp;quot;h5&amp;quot;).hover( &lt;br /&gt;
      function () {&lt;br /&gt;
         showItem($(this));&lt;br /&gt;
      }, &lt;br /&gt;
      function () {&lt;br /&gt;
        hideItem($(this));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    );&lt;br /&gt;
 &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function hideAllItems(){&lt;br /&gt;
    $(&amp;quot;.bodytext&amp;quot;).hide();	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function showItem(myItem){&lt;br /&gt;
      myItem.next().fadeIn(250);&lt;br /&gt;
      myItem.parent().addClass(&amp;quot;topLine&amp;quot;);&lt;br /&gt;
    //myItem.parents().append($(&amp;quot;&amp;lt;span&amp;gt; ***&amp;lt;/span&amp;gt;&amp;quot;));&lt;br /&gt;
    //myItem.parents().(&amp;quot;p&amp;quot;).fadeIn(250);&lt;br /&gt;
    //myItem.parents().append($(&amp;quot;&amp;lt;span&amp;gt; ***&amp;lt;/span&amp;gt;&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function hideItem(myItem){&lt;br /&gt;
    myItem.next().fadeOut(250);&lt;br /&gt;
    myItem.parent().removeClass(&amp;quot;topLine&amp;quot;);&lt;br /&gt;
    //hideAllItems();&lt;br /&gt;
    //myItem.find(&amp;quot;span:last&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
// --&amp;gt;&lt;br /&gt;
	/*]]&amp;gt;*/&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Media:Maphilight-sample01.zip]]‎&lt;br /&gt;
&lt;br /&gt;
Hinweis: damit fadeIn oder show funktionieren indem jQuery den Stil display: none und display: block hinzufügt. Eventuell muß das Element zuerst mit hide() o.ä. versteckt werden. Z.B.:&lt;br /&gt;
 $(&amp;quot;.myElement&amp;quot;).hide().fadeIn(500);&lt;br /&gt;
vorsicht mit visibility: hidden im CSS. Dies führt dazu, daß man das Element trotz show() nicht sieht.&lt;br /&gt;
&lt;br /&gt;
===Append Site Overlay DIV===&lt;br /&gt;
&lt;br /&gt;
Quelle: http://css-tricks.com/snippets/jquery/append-site-overlay-div/ (11/2011)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
   var docHeight = $(document).height();&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;body&amp;quot;).append(&amp;quot;&amp;lt;div id=&amp;#039;overlay&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;#overlay&amp;quot;)&lt;br /&gt;
      .height(docHeight)&lt;br /&gt;
      .css({&lt;br /&gt;
         &amp;#039;opacity&amp;#039; : 0.4,&lt;br /&gt;
         &amp;#039;position&amp;#039;: &amp;#039;absolute&amp;#039;,&lt;br /&gt;
         &amp;#039;top&amp;#039;: 0,&lt;br /&gt;
         &amp;#039;left&amp;#039;: 0,&lt;br /&gt;
         &amp;#039;background-color&amp;#039;: &amp;#039;black&amp;#039;,&lt;br /&gt;
         &amp;#039;width&amp;#039;: &amp;#039;100%&amp;#039;,&lt;br /&gt;
         &amp;#039;z-index&amp;#039;: 5000&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== jQuery - overlay, modal box, lightbox, tooltips ===&lt;br /&gt;
Infos über die verschiedenen Möglichkeiten und die Unterschiede (Todo)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
=== Position eines Elements auslesen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// get Pos of act Item&lt;br /&gt;
var position = $(&amp;quot;#myElement&amp;quot;).offset();&lt;br /&gt;
//console.log(position);&lt;br /&gt;
&lt;br /&gt;
//set positon to other elements...&lt;br /&gt;
$(&amp;quot;#otherElement&amp;quot;).css(position);&lt;br /&gt;
$(&amp;quot;#anotherElement&amp;quot;).css(&amp;quot;top&amp;quot;,(position.top+5));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usability ==&lt;br /&gt;
=== Loading Icon bis Seite komplett geladen ist ===&lt;br /&gt;
Quelle: siehe Links&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;#039;UTF-8&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Simple Loader&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;style&amp;gt;&lt;br /&gt;
		/* This only works with JavaScript,&lt;br /&gt;
		   if it&amp;#039;s not present, don&amp;#039;t show loader */&lt;br /&gt;
		.no-js #loader { display: none;  }&lt;br /&gt;
		.js #loader { display: block; position: absolute; left: 100px; top: 0; }&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;script src=&amp;quot;https://github.com/Modernizr/Modernizr/raw/master/modernizr.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;script&amp;gt;&lt;br /&gt;
		// Wait for window load&lt;br /&gt;
		$(window).load(function() {&lt;br /&gt;
			// Animate loader off screen&lt;br /&gt;
			$(&amp;quot;#loader&amp;quot;).animate({&lt;br /&gt;
				top: -200&lt;br /&gt;
			}, 1500);&lt;br /&gt;
		});&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;download.png&amp;quot; id=&amp;quot;loader&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;http://farm6.static.flickr.com/5299/5400751421_55d49b2786_o.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
 $(&amp;#039;#gbreslib-details-wrap&amp;#039;).fadeTo(&amp;#039;slow&amp;#039;, 1,function() {scrollToAnchor(&amp;quot;gbres_details_anchor&amp;quot;);});&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
=== Attribute vorhanden? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
myAttr = $(this).attr(&amp;#039;myAttr&amp;#039;);&lt;br /&gt;
if (typeof myAttr !== typeof undefined &amp;amp;&amp;amp; myAttr !== false &amp;amp;&amp;amp; myAttr !== &amp;quot;false&amp;quot;) {&lt;br /&gt;
   // Attribut ist vorhanden und nicht &amp;quot;false&amp;quot; -&amp;gt; tu was&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Attribut auslesen / setzen ===&lt;br /&gt;
var meinWert = $(this).attr(&amp;quot;myAttr&amp;quot;);&lt;br /&gt;
 $(this).attr(&amp;quot;myAttr&amp;quot;,&amp;quot;meinWert&amp;quot;);&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_Snippets&amp;diff=20340</id>
		<title>JQuery - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_Snippets&amp;diff=20340"/>
		<updated>2014-07-25T08:09:50Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Attribute testen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nützliche jQuery Schnipsel&lt;br /&gt;
== Grundgerüst zum testen ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta content=&amp;quot;text/html; charset=ISO-8859-1&amp;quot; http-equiv=&amp;quot;content-type&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Test&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;	&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function newFunc(myParam){&lt;br /&gt;
	alert(&amp;#039;hello world&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Testpage&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
[[JavaScript - Snippets]]&lt;br /&gt;
&lt;br /&gt;
http://css-tricks.com/snippets/jquery/&lt;br /&gt;
&lt;br /&gt;
http://www.jquery4u.com/&lt;br /&gt;
&lt;br /&gt;
== Each ==&lt;br /&gt;
 [[jQuery - Nested each / verschachtelte Liste]]&lt;br /&gt;
&lt;br /&gt;
http://www.jquery4u.com/jquery-functions/jquery-each-examples/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//DOM ELEMENTS&lt;br /&gt;
$(&amp;quot;div&amp;quot;).each(function(index, value) { &lt;br /&gt;
    console.log(&amp;#039;div&amp;#039; + index + &amp;#039;:&amp;#039; + $(this).attr(&amp;#039;id&amp;#039;)); &lt;br /&gt;
});&lt;br /&gt;
//outputs the ids of every div on the web page&lt;br /&gt;
//ie - div1:header, div2:body, div3:footer&lt;br /&gt;
&lt;br /&gt;
//ARRAYS&lt;br /&gt;
var arr = [ &amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, &amp;quot;five&amp;quot; ];&lt;br /&gt;
jQuery.each(arr, function(index, value) {&lt;br /&gt;
       console.log(this);&lt;br /&gt;
       return (this != &amp;quot;three&amp;quot;); // will stop running after &amp;quot;three&amp;quot;&lt;br /&gt;
   });&lt;br /&gt;
//outputs: one two three&lt;br /&gt;
&lt;br /&gt;
//OBJECTS&lt;br /&gt;
var obj = { one:1, two:2, three:3, four:4, five:5 };&lt;br /&gt;
    jQuery.each(obj, function(i, val) {&lt;br /&gt;
       console.log(val);&lt;br /&gt;
    });&lt;br /&gt;
//outputs: 1 2 3 4 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== jQuery Countdown Scripts ===&lt;br /&gt;
http://www.tripwiremagazine.com/2012/01/jquery-countdown-scripts.html&lt;br /&gt;
&lt;br /&gt;
== Formulare ==&lt;br /&gt;
Siehe auch [[JQuery - AJAX]]&lt;br /&gt;
=== GET-Variable in URL auslesen ===&lt;br /&gt;
Diese muß extrahiert werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&lt;br /&gt;
&lt;br /&gt;
Quelle: http://jquery-howto.blogspot.de/2009/09/get-url-parameters-values-with-jquery.html (Zugriff: 2013/01)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Read a page&amp;#039;s GET URL variables and return them as an associative array.&lt;br /&gt;
function getUrlVars()&lt;br /&gt;
{&lt;br /&gt;
    var vars = [], hash;&lt;br /&gt;
    var hashes = window.location.href.slice(window.location.href.indexOf(&amp;#039;?&amp;#039;) + 1).split(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
    for(var i = 0; i &amp;lt; hashes.length; i++)&lt;br /&gt;
    {&lt;br /&gt;
        hash = hashes[i].split(&amp;#039;=&amp;#039;);&lt;br /&gt;
        vars.push(hash[0]);&lt;br /&gt;
        vars[hash[0]] = hash[1];&lt;br /&gt;
    }&lt;br /&gt;
    return vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurzform:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function getUrlVars()&lt;br /&gt;
{&lt;br /&gt;
return window.location.href.slice(window.location.href.indexOf(&amp;#039;?&amp;#039;)).split(/[&amp;amp;?]{1}[\w\d]+=/);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf von:&lt;br /&gt;
 http://www.example.com/?me=myValue&amp;amp;name2=SomeOtherValue&lt;br /&gt;
&lt;br /&gt;
ergibt folgendes Array:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;me&amp;quot;    : &amp;quot;myValue&amp;quot;,&lt;br /&gt;
    &amp;quot;name2&amp;quot; : &amp;quot;SomeOtherValue&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Bei mir funktionierte es nicht mit Aufruf ohne Parameter. Dann entsteht nur ein nicht assoziatives Array. Das liegt wahrscheinlich daran, daß JavaScript eigentlich keine assoziativen Arrays kennt. Folgender Aufruf funktioniert aber:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var first = getUrlVars()[&amp;quot;me&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// To get the second parameter&lt;br /&gt;
var second = getUrlVars()[&amp;quot;name2&amp;quot;];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&lt;br /&gt;
&lt;br /&gt;
Etwas älteres Beispiel von: http://www.tutorials.de/javascript-ajax/149174-probleme-mit-dem-auslesen-von-variablen.html (Zugriff 2013/01)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;SCRIPT type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
HTTP_GET_VARS=new Array();&lt;br /&gt;
strGET=document.location.search.substr(1,document.location.search.length);&lt;br /&gt;
if(strGET!=&amp;#039;&amp;#039;)&lt;br /&gt;
    {&lt;br /&gt;
    gArr=strGET.split(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
    for(i=0;i&amp;lt;gArr.length;++i)&lt;br /&gt;
        {&lt;br /&gt;
        v=&amp;#039;&amp;#039;;vArr=gArr[i].split(&amp;#039;=&amp;#039;);&lt;br /&gt;
        if(vArr.length&amp;gt;1){v=vArr[1];}&lt;br /&gt;
        HTTP_GET_VARS[unescape(vArr[0])]=unescape(v);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
function GET(v)&lt;br /&gt;
{&lt;br /&gt;
if(!HTTP_GET_VARS[v]){return &amp;#039;undefined&amp;#039;;}&lt;br /&gt;
return HTTP_GET_VARS[v];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
document.writeln (&amp;#039;Erste Var:&amp;#039; + GET(&amp;#039;text&amp;#039;) + &amp;#039; du&amp;#039;);&lt;br /&gt;
document.writeln (&amp;#039;Zweite Var:&amp;#039; + GET(&amp;#039;text2&amp;#039;) + &amp;#039; da draussen&amp;#039;);&lt;br /&gt;
// --&amp;gt;&lt;br /&gt;
&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fokus auf erstes Input-Feld im Formular setzen ===&lt;br /&gt;
 // focus on the first text input field on the page&lt;br /&gt;
 $(&amp;quot;input[type=&amp;#039;text&amp;#039;]:first&amp;quot;, document.forms[0]).focus();&lt;br /&gt;
&lt;br /&gt;
=== Werte von Formularen auslesen ===&lt;br /&gt;
http://www.beier-christian.eu/blog/weblog/jquery-ausgewahlte-option-aus-select-box-auslesen/&lt;br /&gt;
&lt;br /&gt;
==== Select Boxen ====&lt;br /&gt;
Hinweis, vieles ist natürlich auch mit anderen Elementen möglich.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;obst&amp;quot;&amp;gt;Obst&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;obst&amp;quot; id=&amp;quot;obst&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Orange&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;Apfel&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;Banane&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wert auslesen&lt;br /&gt;
 $(&amp;#039;select#obst&amp;#039;).val();&lt;br /&gt;
&lt;br /&gt;
Text des Wertes auslesen&lt;br /&gt;
 $(&amp;#039;select#obst :selected&amp;#039;).text();&lt;br /&gt;
&lt;br /&gt;
Text mehrerer gewählter Optionen ausgeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;select#obst :selected&amp;#039;).each(function(i, option) {&lt;br /&gt;
  // Verarbeitung der Optionen&lt;br /&gt;
  alert(option.value + &amp;#039; &amp;#039; + option.text);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispiel: Alle gewählten Werte bei Veränderung in ein div (id=message) schreiben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;quot;select&amp;quot;).change(function () {&lt;br /&gt;
  var str = &amp;quot;&amp;quot;;&lt;br /&gt;
  $(&amp;quot;select option:selected&amp;quot;).each(function () {&lt;br /&gt;
    str += $(this).text();&lt;br /&gt;
  });&lt;br /&gt;
  $(&amp;quot;div#message&amp;quot;).text(str);&lt;br /&gt;
}).change(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Checkboxen ====&lt;br /&gt;
Links:&lt;br /&gt;
http://technosophos.com/node/223 (Zugriff 07-2012)&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Checked ? Returns a boolean, true if checked, false otherwise&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).is(&amp;#039;:checked&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Check checkbox - this sets the attribute checked=&amp;quot;checked&amp;quot;&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).attr(&amp;#039;checked&amp;#039;,&amp;#039;checked&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Uncheck checkbox (right way)&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).removeAttr(&amp;#039;checked&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Check / Uncheck everything&lt;br /&gt;
&lt;br /&gt;
// Check anything that is not already checked:&lt;br /&gt;
jQuery(&amp;#039;:checkbox:not(:checked)&amp;#039;).attr(&amp;#039;checked&amp;#039;, &amp;#039;checked&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
// Remove the checkbox&lt;br /&gt;
jQuery(&amp;#039;:checkbox:checked&amp;#039;).removeAttr(&amp;#039;checked&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kleines Hide Show Script wenn eine Checkbox ausgewählt ist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
			$(&amp;quot;input[name=&amp;#039;calib_as_offered&amp;#039;]&amp;quot;).change(function() {&lt;br /&gt;
				if ($(&amp;quot;input[name=&amp;#039;calib_as_offered&amp;#039;]&amp;quot;).is(&amp;quot;:checked&amp;quot;)){&lt;br /&gt;
					$(&amp;quot;#contact_address&amp;quot;).show();&lt;br /&gt;
					$(&amp;quot;#offer_nr_wrap&amp;quot;).show();&lt;br /&gt;
				} &lt;br /&gt;
				else {&lt;br /&gt;
					$(&amp;quot;#contact_address&amp;quot;).hide();&lt;br /&gt;
					$(&amp;quot;#offer_nr_wrap&amp;quot;).hide();					&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Radio Buttons ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Change Listener für Radio Buttons&amp;#039;&amp;#039;&amp;#039; (Quelle: http://stackoverflow.com/questions/10167395/how-can-i-attach-a-listener-to-multiple-radio-buttons Zugriff: 2013-08)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;input:radio&amp;#039;).on(&amp;#039;change&amp;#039;, function(){&lt;br /&gt;
    //access value of changed radio group with $(this).val()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quelle der folgenden Beispiele: http://mabraham.de/jquery-radio-buttons-auslesen-und-manipulieren/ (Zugriff 2013-08)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wert (value) einer Radio Group auslesen.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-button-value&amp;#039;).click(function(){&lt;br /&gt;
    alert($(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).val());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button gewählt checked ?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#element&amp;#039;).click(function() {&lt;br /&gt;
   if($(&amp;#039;#radio_button&amp;#039;).is(&amp;#039;:checked&amp;#039;)) { alert(&amp;quot;it&amp;#039;s checked&amp;quot;); }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-button-is-set&amp;#039;).click(function(){&lt;br /&gt;
    alert(typeof $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).val() != &amp;#039;undefined&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button anhand seiner Id auswählen (check)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-checked-by-id&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;#gruppe1&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button über Wert auswählen (check) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-checked-by-value&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;][value=&amp;#039;2&amp;#039;]&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button abwählen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-uncheck&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).removeAttr(&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser ==&lt;br /&gt;
=== Resize des Browserfensters feststellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot; src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
 &lt;br /&gt;
//If the User resizes the window, adjust the #container height&lt;br /&gt;
$(window).bind(&amp;quot;resize&amp;quot;, resizeWindow);&lt;br /&gt;
function resizeWindow( e ) {&lt;br /&gt;
	var newWindowHeight = $(window).height();&lt;br /&gt;
	$(&amp;quot;#container&amp;quot;).css(&amp;quot;min-height&amp;quot;, newWindowHeight );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
});			&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Templates - Vorlagen ==&lt;br /&gt;
=== XHTML 1.0 Template mit jQuery ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;content-type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Title goes here &amp;amp;raquo; Site title here&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Meta Tags --&amp;gt;&lt;br /&gt;
	&amp;lt;base href=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;copyright&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;robots&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;generator&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;expires&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;cache-control&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- Fav icon --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;shortcut icon&amp;quot; href=&amp;quot;/favicon.ico&amp;quot; type=&amp;quot;image/x-icon&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- JavaScript setup --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	/*&amp;lt;![CDATA[*/&lt;br /&gt;
	// add &amp;#039;js&amp;#039; class to root element to nicely allow css that degrades gracefully if js is disabled&lt;br /&gt;
	document.getElementsByTagName(&amp;#039;html&amp;#039;)[0].className = &amp;#039;js&amp;#039;;&lt;br /&gt;
	/*]]&amp;gt;*/&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- CSS --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/screen.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen, projection&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/print.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;print&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!--[if IE]&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/ie-all.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen, projection&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;![endif]--&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
		&amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Title of page goes here&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;h2&amp;gt;Subtitle of page goes here&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end header div --&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;breadcrumbs&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sub directory&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Current page&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end nav div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sidebar link #1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sidebar link #2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;div id=&amp;quot;sub1&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;h3&amp;gt;Title of content&amp;lt;/h3&amp;gt;&lt;br /&gt;
				&amp;lt;p&amp;gt;Begin content here&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div id=&amp;quot;sub2&amp;quot; class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;h3&amp;gt;Title of content&amp;lt;/h3&amp;gt;&lt;br /&gt;
				&amp;lt;p&amp;gt;Begin content here&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end main div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;p&amp;gt;&amp;amp;copy;2XXX company name here. Creative Commons link, your own link, validation, etc.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end footer div --&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;/div&amp;gt;&amp;lt;!-- end container div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/app.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;!-- place Google Analytics code here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== JavaScript nachladen während die Seite schon angezeigt wird ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Add this onDocumentReady function to the end of the jQuery.js file. &lt;br /&gt;
// It MUST be in the jquery file to work correctly.&lt;br /&gt;
$(function(){&lt;br /&gt;
	var scripts = /\?(.*)/, files = [], path = /^.*\//, loaded = 0, count = 0;&lt;br /&gt;
 &lt;br /&gt;
	$(&amp;#039;script&amp;#039;).each(function(){&lt;br /&gt;
		var src = $(this).attr(&amp;#039;src&amp;#039;);&lt;br /&gt;
		if (!scripts.test(src)) return;&lt;br /&gt;
		var pathto = src.match(path);&lt;br /&gt;
		files = files.concat($.map(src.match(scripts).pop().split(&amp;#039;,&amp;#039;), function(e,i){&lt;br /&gt;
			return pathto+e+&amp;#039;.js&amp;#039;&lt;br /&gt;
		}));&lt;br /&gt;
	})&lt;br /&gt;
 &lt;br /&gt;
	count = files.length;&lt;br /&gt;
 &lt;br /&gt;
	$.each(files, function(){&lt;br /&gt;
		$.getScript(this, function(){&lt;br /&gt;
			loaded++;&lt;br /&gt;
			if(loaded == count &amp;amp;&amp;amp; typeof onBackload == &amp;#039;function&amp;#039;)&lt;br /&gt;
				onBackload(loaded)&lt;br /&gt;
		})&lt;br /&gt;
	})&lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * If you have the following script tags:&lt;br /&gt;
 * 	&amp;lt;script src=&amp;quot;/path/to/jquery.min.js?somefile,otherfile.min,thirdfile&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 * 	&amp;lt;script src=&amp;quot;/other/path/foo.js?different.file,final.file&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 * This script will &amp;quot;backload&amp;quot; the following files:&lt;br /&gt;
 * 	/path/to/somefile.js&lt;br /&gt;
 *	/path/to/otherfile.min.js&lt;br /&gt;
 * 	/path/to/thirdfile.js&lt;br /&gt;
 * 	/other/path/different.file.js&lt;br /&gt;
 *	/other/path/final.file.js&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
// And if you declare a function named &amp;quot;onBackload&amp;quot;, it will be fired when all the scripts are loaded&lt;br /&gt;
// This is handy for getting things going once you&amp;#039;re confident your scripts have all been included.&lt;br /&gt;
function onBackload(loaded){&lt;br /&gt;
	alert(&amp;#039;All &amp;#039; + loaded + &amp;#039; files backloaded!&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Manipulation ==&lt;br /&gt;
=== Einfaches Rollover Hide Show Skript ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	/*&amp;lt;![CDATA[*/&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
//var j = jQuery.noConflict();&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    hideAllItems();	&lt;br /&gt;
&lt;br /&gt;
    $(&amp;quot;h5&amp;quot;).hover( &lt;br /&gt;
      function () {&lt;br /&gt;
         showItem($(this));&lt;br /&gt;
      }, &lt;br /&gt;
      function () {&lt;br /&gt;
        hideItem($(this));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    );&lt;br /&gt;
 &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function hideAllItems(){&lt;br /&gt;
    $(&amp;quot;.bodytext&amp;quot;).hide();	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function showItem(myItem){&lt;br /&gt;
      myItem.next().fadeIn(250);&lt;br /&gt;
      myItem.parent().addClass(&amp;quot;topLine&amp;quot;);&lt;br /&gt;
    //myItem.parents().append($(&amp;quot;&amp;lt;span&amp;gt; ***&amp;lt;/span&amp;gt;&amp;quot;));&lt;br /&gt;
    //myItem.parents().(&amp;quot;p&amp;quot;).fadeIn(250);&lt;br /&gt;
    //myItem.parents().append($(&amp;quot;&amp;lt;span&amp;gt; ***&amp;lt;/span&amp;gt;&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function hideItem(myItem){&lt;br /&gt;
    myItem.next().fadeOut(250);&lt;br /&gt;
    myItem.parent().removeClass(&amp;quot;topLine&amp;quot;);&lt;br /&gt;
    //hideAllItems();&lt;br /&gt;
    //myItem.find(&amp;quot;span:last&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
// --&amp;gt;&lt;br /&gt;
	/*]]&amp;gt;*/&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Media:Maphilight-sample01.zip]]‎&lt;br /&gt;
&lt;br /&gt;
Hinweis: damit fadeIn oder show funktionieren indem jQuery den Stil display: none und display: block hinzufügt. Eventuell muß das Element zuerst mit hide() o.ä. versteckt werden. Z.B.:&lt;br /&gt;
 $(&amp;quot;.myElement&amp;quot;).hide().fadeIn(500);&lt;br /&gt;
vorsicht mit visibility: hidden im CSS. Dies führt dazu, daß man das Element trotz show() nicht sieht.&lt;br /&gt;
&lt;br /&gt;
===Append Site Overlay DIV===&lt;br /&gt;
&lt;br /&gt;
Quelle: http://css-tricks.com/snippets/jquery/append-site-overlay-div/ (11/2011)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
   var docHeight = $(document).height();&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;body&amp;quot;).append(&amp;quot;&amp;lt;div id=&amp;#039;overlay&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;#overlay&amp;quot;)&lt;br /&gt;
      .height(docHeight)&lt;br /&gt;
      .css({&lt;br /&gt;
         &amp;#039;opacity&amp;#039; : 0.4,&lt;br /&gt;
         &amp;#039;position&amp;#039;: &amp;#039;absolute&amp;#039;,&lt;br /&gt;
         &amp;#039;top&amp;#039;: 0,&lt;br /&gt;
         &amp;#039;left&amp;#039;: 0,&lt;br /&gt;
         &amp;#039;background-color&amp;#039;: &amp;#039;black&amp;#039;,&lt;br /&gt;
         &amp;#039;width&amp;#039;: &amp;#039;100%&amp;#039;,&lt;br /&gt;
         &amp;#039;z-index&amp;#039;: 5000&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== jQuery - overlay, modal box, lightbox, tooltips ===&lt;br /&gt;
Infos über die verschiedenen Möglichkeiten und die Unterschiede (Todo)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
=== Position eines Elements auslesen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// get Pos of act Item&lt;br /&gt;
var position = $(&amp;quot;#myElement&amp;quot;).offset();&lt;br /&gt;
//console.log(position);&lt;br /&gt;
&lt;br /&gt;
//set positon to other elements...&lt;br /&gt;
$(&amp;quot;#otherElement&amp;quot;).css(position);&lt;br /&gt;
$(&amp;quot;#anotherElement&amp;quot;).css(&amp;quot;top&amp;quot;,(position.top+5));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usability ==&lt;br /&gt;
=== Loading Icon bis Seite komplett geladen ist ===&lt;br /&gt;
Quelle: siehe Links&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;#039;UTF-8&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Simple Loader&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;style&amp;gt;&lt;br /&gt;
		/* This only works with JavaScript,&lt;br /&gt;
		   if it&amp;#039;s not present, don&amp;#039;t show loader */&lt;br /&gt;
		.no-js #loader { display: none;  }&lt;br /&gt;
		.js #loader { display: block; position: absolute; left: 100px; top: 0; }&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;script src=&amp;quot;https://github.com/Modernizr/Modernizr/raw/master/modernizr.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;script&amp;gt;&lt;br /&gt;
		// Wait for window load&lt;br /&gt;
		$(window).load(function() {&lt;br /&gt;
			// Animate loader off screen&lt;br /&gt;
			$(&amp;quot;#loader&amp;quot;).animate({&lt;br /&gt;
				top: -200&lt;br /&gt;
			}, 1500);&lt;br /&gt;
		});&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;download.png&amp;quot; id=&amp;quot;loader&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;http://farm6.static.flickr.com/5299/5400751421_55d49b2786_o.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
 $(&amp;#039;#gbreslib-details-wrap&amp;#039;).fadeTo(&amp;#039;slow&amp;#039;, 1,function() {scrollToAnchor(&amp;quot;gbres_details_anchor&amp;quot;);});&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
=== Attribute vorhanden? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
myAttr = $(this).attr(&amp;#039;myAttr&amp;#039;);&lt;br /&gt;
if (typeof myAttr !== typeof undefined &amp;amp;&amp;amp; myAttr !== false &amp;amp;&amp;amp; myAttr !== &amp;quot;false&amp;quot;) {&lt;br /&gt;
   // Attribut ist vorhanden und nicht &amp;quot;false&amp;quot; -&amp;gt; tu was&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_Snippets&amp;diff=20339</id>
		<title>JQuery - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_Snippets&amp;diff=20339"/>
		<updated>2014-07-25T08:09:19Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nützliche jQuery Schnipsel&lt;br /&gt;
== Grundgerüst zum testen ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta content=&amp;quot;text/html; charset=ISO-8859-1&amp;quot; http-equiv=&amp;quot;content-type&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Test&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;	&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function newFunc(myParam){&lt;br /&gt;
	alert(&amp;#039;hello world&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Testpage&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
[[JavaScript - Snippets]]&lt;br /&gt;
&lt;br /&gt;
http://css-tricks.com/snippets/jquery/&lt;br /&gt;
&lt;br /&gt;
http://www.jquery4u.com/&lt;br /&gt;
&lt;br /&gt;
== Each ==&lt;br /&gt;
 [[jQuery - Nested each / verschachtelte Liste]]&lt;br /&gt;
&lt;br /&gt;
http://www.jquery4u.com/jquery-functions/jquery-each-examples/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//DOM ELEMENTS&lt;br /&gt;
$(&amp;quot;div&amp;quot;).each(function(index, value) { &lt;br /&gt;
    console.log(&amp;#039;div&amp;#039; + index + &amp;#039;:&amp;#039; + $(this).attr(&amp;#039;id&amp;#039;)); &lt;br /&gt;
});&lt;br /&gt;
//outputs the ids of every div on the web page&lt;br /&gt;
//ie - div1:header, div2:body, div3:footer&lt;br /&gt;
&lt;br /&gt;
//ARRAYS&lt;br /&gt;
var arr = [ &amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, &amp;quot;five&amp;quot; ];&lt;br /&gt;
jQuery.each(arr, function(index, value) {&lt;br /&gt;
       console.log(this);&lt;br /&gt;
       return (this != &amp;quot;three&amp;quot;); // will stop running after &amp;quot;three&amp;quot;&lt;br /&gt;
   });&lt;br /&gt;
//outputs: one two three&lt;br /&gt;
&lt;br /&gt;
//OBJECTS&lt;br /&gt;
var obj = { one:1, two:2, three:3, four:4, five:5 };&lt;br /&gt;
    jQuery.each(obj, function(i, val) {&lt;br /&gt;
       console.log(val);&lt;br /&gt;
    });&lt;br /&gt;
//outputs: 1 2 3 4 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== jQuery Countdown Scripts ===&lt;br /&gt;
http://www.tripwiremagazine.com/2012/01/jquery-countdown-scripts.html&lt;br /&gt;
&lt;br /&gt;
== Formulare ==&lt;br /&gt;
Siehe auch [[JQuery - AJAX]]&lt;br /&gt;
=== GET-Variable in URL auslesen ===&lt;br /&gt;
Diese muß extrahiert werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&lt;br /&gt;
&lt;br /&gt;
Quelle: http://jquery-howto.blogspot.de/2009/09/get-url-parameters-values-with-jquery.html (Zugriff: 2013/01)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Read a page&amp;#039;s GET URL variables and return them as an associative array.&lt;br /&gt;
function getUrlVars()&lt;br /&gt;
{&lt;br /&gt;
    var vars = [], hash;&lt;br /&gt;
    var hashes = window.location.href.slice(window.location.href.indexOf(&amp;#039;?&amp;#039;) + 1).split(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
    for(var i = 0; i &amp;lt; hashes.length; i++)&lt;br /&gt;
    {&lt;br /&gt;
        hash = hashes[i].split(&amp;#039;=&amp;#039;);&lt;br /&gt;
        vars.push(hash[0]);&lt;br /&gt;
        vars[hash[0]] = hash[1];&lt;br /&gt;
    }&lt;br /&gt;
    return vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurzform:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function getUrlVars()&lt;br /&gt;
{&lt;br /&gt;
return window.location.href.slice(window.location.href.indexOf(&amp;#039;?&amp;#039;)).split(/[&amp;amp;?]{1}[\w\d]+=/);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf von:&lt;br /&gt;
 http://www.example.com/?me=myValue&amp;amp;name2=SomeOtherValue&lt;br /&gt;
&lt;br /&gt;
ergibt folgendes Array:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;me&amp;quot;    : &amp;quot;myValue&amp;quot;,&lt;br /&gt;
    &amp;quot;name2&amp;quot; : &amp;quot;SomeOtherValue&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Bei mir funktionierte es nicht mit Aufruf ohne Parameter. Dann entsteht nur ein nicht assoziatives Array. Das liegt wahrscheinlich daran, daß JavaScript eigentlich keine assoziativen Arrays kennt. Folgender Aufruf funktioniert aber:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var first = getUrlVars()[&amp;quot;me&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// To get the second parameter&lt;br /&gt;
var second = getUrlVars()[&amp;quot;name2&amp;quot;];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&lt;br /&gt;
&lt;br /&gt;
Etwas älteres Beispiel von: http://www.tutorials.de/javascript-ajax/149174-probleme-mit-dem-auslesen-von-variablen.html (Zugriff 2013/01)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;SCRIPT type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
HTTP_GET_VARS=new Array();&lt;br /&gt;
strGET=document.location.search.substr(1,document.location.search.length);&lt;br /&gt;
if(strGET!=&amp;#039;&amp;#039;)&lt;br /&gt;
    {&lt;br /&gt;
    gArr=strGET.split(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
    for(i=0;i&amp;lt;gArr.length;++i)&lt;br /&gt;
        {&lt;br /&gt;
        v=&amp;#039;&amp;#039;;vArr=gArr[i].split(&amp;#039;=&amp;#039;);&lt;br /&gt;
        if(vArr.length&amp;gt;1){v=vArr[1];}&lt;br /&gt;
        HTTP_GET_VARS[unescape(vArr[0])]=unescape(v);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
function GET(v)&lt;br /&gt;
{&lt;br /&gt;
if(!HTTP_GET_VARS[v]){return &amp;#039;undefined&amp;#039;;}&lt;br /&gt;
return HTTP_GET_VARS[v];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
document.writeln (&amp;#039;Erste Var:&amp;#039; + GET(&amp;#039;text&amp;#039;) + &amp;#039; du&amp;#039;);&lt;br /&gt;
document.writeln (&amp;#039;Zweite Var:&amp;#039; + GET(&amp;#039;text2&amp;#039;) + &amp;#039; da draussen&amp;#039;);&lt;br /&gt;
// --&amp;gt;&lt;br /&gt;
&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fokus auf erstes Input-Feld im Formular setzen ===&lt;br /&gt;
 // focus on the first text input field on the page&lt;br /&gt;
 $(&amp;quot;input[type=&amp;#039;text&amp;#039;]:first&amp;quot;, document.forms[0]).focus();&lt;br /&gt;
&lt;br /&gt;
=== Werte von Formularen auslesen ===&lt;br /&gt;
http://www.beier-christian.eu/blog/weblog/jquery-ausgewahlte-option-aus-select-box-auslesen/&lt;br /&gt;
&lt;br /&gt;
==== Select Boxen ====&lt;br /&gt;
Hinweis, vieles ist natürlich auch mit anderen Elementen möglich.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;obst&amp;quot;&amp;gt;Obst&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;obst&amp;quot; id=&amp;quot;obst&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Orange&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;Apfel&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;Banane&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wert auslesen&lt;br /&gt;
 $(&amp;#039;select#obst&amp;#039;).val();&lt;br /&gt;
&lt;br /&gt;
Text des Wertes auslesen&lt;br /&gt;
 $(&amp;#039;select#obst :selected&amp;#039;).text();&lt;br /&gt;
&lt;br /&gt;
Text mehrerer gewählter Optionen ausgeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;select#obst :selected&amp;#039;).each(function(i, option) {&lt;br /&gt;
  // Verarbeitung der Optionen&lt;br /&gt;
  alert(option.value + &amp;#039; &amp;#039; + option.text);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispiel: Alle gewählten Werte bei Veränderung in ein div (id=message) schreiben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;quot;select&amp;quot;).change(function () {&lt;br /&gt;
  var str = &amp;quot;&amp;quot;;&lt;br /&gt;
  $(&amp;quot;select option:selected&amp;quot;).each(function () {&lt;br /&gt;
    str += $(this).text();&lt;br /&gt;
  });&lt;br /&gt;
  $(&amp;quot;div#message&amp;quot;).text(str);&lt;br /&gt;
}).change(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Checkboxen ====&lt;br /&gt;
Links:&lt;br /&gt;
http://technosophos.com/node/223 (Zugriff 07-2012)&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Checked ? Returns a boolean, true if checked, false otherwise&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).is(&amp;#039;:checked&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Check checkbox - this sets the attribute checked=&amp;quot;checked&amp;quot;&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).attr(&amp;#039;checked&amp;#039;,&amp;#039;checked&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Uncheck checkbox (right way)&lt;br /&gt;
jQuery(&amp;#039;#my-checkbox&amp;#039;).removeAttr(&amp;#039;checked&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Check / Uncheck everything&lt;br /&gt;
&lt;br /&gt;
// Check anything that is not already checked:&lt;br /&gt;
jQuery(&amp;#039;:checkbox:not(:checked)&amp;#039;).attr(&amp;#039;checked&amp;#039;, &amp;#039;checked&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
// Remove the checkbox&lt;br /&gt;
jQuery(&amp;#039;:checkbox:checked&amp;#039;).removeAttr(&amp;#039;checked&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kleines Hide Show Script wenn eine Checkbox ausgewählt ist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
			$(&amp;quot;input[name=&amp;#039;calib_as_offered&amp;#039;]&amp;quot;).change(function() {&lt;br /&gt;
				if ($(&amp;quot;input[name=&amp;#039;calib_as_offered&amp;#039;]&amp;quot;).is(&amp;quot;:checked&amp;quot;)){&lt;br /&gt;
					$(&amp;quot;#contact_address&amp;quot;).show();&lt;br /&gt;
					$(&amp;quot;#offer_nr_wrap&amp;quot;).show();&lt;br /&gt;
				} &lt;br /&gt;
				else {&lt;br /&gt;
					$(&amp;quot;#contact_address&amp;quot;).hide();&lt;br /&gt;
					$(&amp;quot;#offer_nr_wrap&amp;quot;).hide();					&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Radio Buttons ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Change Listener für Radio Buttons&amp;#039;&amp;#039;&amp;#039; (Quelle: http://stackoverflow.com/questions/10167395/how-can-i-attach-a-listener-to-multiple-radio-buttons Zugriff: 2013-08)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;input:radio&amp;#039;).on(&amp;#039;change&amp;#039;, function(){&lt;br /&gt;
    //access value of changed radio group with $(this).val()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quelle der folgenden Beispiele: http://mabraham.de/jquery-radio-buttons-auslesen-und-manipulieren/ (Zugriff 2013-08)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wert (value) einer Radio Group auslesen.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-button-value&amp;#039;).click(function(){&lt;br /&gt;
    alert($(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).val());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button gewählt checked ?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#element&amp;#039;).click(function() {&lt;br /&gt;
   if($(&amp;#039;#radio_button&amp;#039;).is(&amp;#039;:checked&amp;#039;)) { alert(&amp;quot;it&amp;#039;s checked&amp;quot;); }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-button-is-set&amp;#039;).click(function(){&lt;br /&gt;
    alert(typeof $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).val() != &amp;#039;undefined&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button anhand seiner Id auswählen (check)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-checked-by-id&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;#gruppe1&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button über Wert auswählen (check) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-checked-by-value&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;][value=&amp;#039;2&amp;#039;]&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radio Button abwählen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;#radio-uncheck&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;quot;input[name=&amp;#039;radio-button-gruppe&amp;#039;]:checked&amp;quot;).removeAttr(&amp;quot;checked&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser ==&lt;br /&gt;
=== Resize des Browserfensters feststellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot; src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
 &lt;br /&gt;
//If the User resizes the window, adjust the #container height&lt;br /&gt;
$(window).bind(&amp;quot;resize&amp;quot;, resizeWindow);&lt;br /&gt;
function resizeWindow( e ) {&lt;br /&gt;
	var newWindowHeight = $(window).height();&lt;br /&gt;
	$(&amp;quot;#container&amp;quot;).css(&amp;quot;min-height&amp;quot;, newWindowHeight );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
});			&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Templates - Vorlagen ==&lt;br /&gt;
=== XHTML 1.0 Template mit jQuery ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;content-type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Title goes here &amp;amp;raquo; Site title here&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Meta Tags --&amp;gt;&lt;br /&gt;
	&amp;lt;base href=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;copyright&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;robots&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;generator&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;expires&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;cache-control&amp;quot; content=&amp;quot;#&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- Fav icon --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;shortcut icon&amp;quot; href=&amp;quot;/favicon.ico&amp;quot; type=&amp;quot;image/x-icon&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- JavaScript setup --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	/*&amp;lt;![CDATA[*/&lt;br /&gt;
	// add &amp;#039;js&amp;#039; class to root element to nicely allow css that degrades gracefully if js is disabled&lt;br /&gt;
	document.getElementsByTagName(&amp;#039;html&amp;#039;)[0].className = &amp;#039;js&amp;#039;;&lt;br /&gt;
	/*]]&amp;gt;*/&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- CSS --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/screen.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen, projection&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/print.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;print&amp;quot; /&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!--[if IE]&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/ie-all.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen, projection&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;![endif]--&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
		&amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Title of page goes here&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;h2&amp;gt;Subtitle of page goes here&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end header div --&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link #3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;breadcrumbs&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sub directory&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Current page&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end nav div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;ul class=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sidebar link #1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
				&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Sidebar link #2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;div id=&amp;quot;sub1&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;h3&amp;gt;Title of content&amp;lt;/h3&amp;gt;&lt;br /&gt;
				&amp;lt;p&amp;gt;Begin content here&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;div id=&amp;quot;sub2&amp;quot; class=&amp;quot;hide&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;h3&amp;gt;Title of content&amp;lt;/h3&amp;gt;&lt;br /&gt;
				&amp;lt;p&amp;gt;Begin content here&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end main div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;p&amp;gt;&amp;amp;copy;2XXX company name here. Creative Commons link, your own link, validation, etc.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;!-- end footer div --&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;/div&amp;gt;&amp;lt;!-- end container div --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/app.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;!-- place Google Analytics code here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== JavaScript nachladen während die Seite schon angezeigt wird ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Add this onDocumentReady function to the end of the jQuery.js file. &lt;br /&gt;
// It MUST be in the jquery file to work correctly.&lt;br /&gt;
$(function(){&lt;br /&gt;
	var scripts = /\?(.*)/, files = [], path = /^.*\//, loaded = 0, count = 0;&lt;br /&gt;
 &lt;br /&gt;
	$(&amp;#039;script&amp;#039;).each(function(){&lt;br /&gt;
		var src = $(this).attr(&amp;#039;src&amp;#039;);&lt;br /&gt;
		if (!scripts.test(src)) return;&lt;br /&gt;
		var pathto = src.match(path);&lt;br /&gt;
		files = files.concat($.map(src.match(scripts).pop().split(&amp;#039;,&amp;#039;), function(e,i){&lt;br /&gt;
			return pathto+e+&amp;#039;.js&amp;#039;&lt;br /&gt;
		}));&lt;br /&gt;
	})&lt;br /&gt;
 &lt;br /&gt;
	count = files.length;&lt;br /&gt;
 &lt;br /&gt;
	$.each(files, function(){&lt;br /&gt;
		$.getScript(this, function(){&lt;br /&gt;
			loaded++;&lt;br /&gt;
			if(loaded == count &amp;amp;&amp;amp; typeof onBackload == &amp;#039;function&amp;#039;)&lt;br /&gt;
				onBackload(loaded)&lt;br /&gt;
		})&lt;br /&gt;
	})&lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * If you have the following script tags:&lt;br /&gt;
 * 	&amp;lt;script src=&amp;quot;/path/to/jquery.min.js?somefile,otherfile.min,thirdfile&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 * 	&amp;lt;script src=&amp;quot;/other/path/foo.js?different.file,final.file&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 * This script will &amp;quot;backload&amp;quot; the following files:&lt;br /&gt;
 * 	/path/to/somefile.js&lt;br /&gt;
 *	/path/to/otherfile.min.js&lt;br /&gt;
 * 	/path/to/thirdfile.js&lt;br /&gt;
 * 	/other/path/different.file.js&lt;br /&gt;
 *	/other/path/final.file.js&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
// And if you declare a function named &amp;quot;onBackload&amp;quot;, it will be fired when all the scripts are loaded&lt;br /&gt;
// This is handy for getting things going once you&amp;#039;re confident your scripts have all been included.&lt;br /&gt;
function onBackload(loaded){&lt;br /&gt;
	alert(&amp;#039;All &amp;#039; + loaded + &amp;#039; files backloaded!&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Manipulation ==&lt;br /&gt;
=== Einfaches Rollover Hide Show Skript ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	/*&amp;lt;![CDATA[*/&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
//var j = jQuery.noConflict();&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    hideAllItems();	&lt;br /&gt;
&lt;br /&gt;
    $(&amp;quot;h5&amp;quot;).hover( &lt;br /&gt;
      function () {&lt;br /&gt;
         showItem($(this));&lt;br /&gt;
      }, &lt;br /&gt;
      function () {&lt;br /&gt;
        hideItem($(this));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    );&lt;br /&gt;
 &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function hideAllItems(){&lt;br /&gt;
    $(&amp;quot;.bodytext&amp;quot;).hide();	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function showItem(myItem){&lt;br /&gt;
      myItem.next().fadeIn(250);&lt;br /&gt;
      myItem.parent().addClass(&amp;quot;topLine&amp;quot;);&lt;br /&gt;
    //myItem.parents().append($(&amp;quot;&amp;lt;span&amp;gt; ***&amp;lt;/span&amp;gt;&amp;quot;));&lt;br /&gt;
    //myItem.parents().(&amp;quot;p&amp;quot;).fadeIn(250);&lt;br /&gt;
    //myItem.parents().append($(&amp;quot;&amp;lt;span&amp;gt; ***&amp;lt;/span&amp;gt;&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function hideItem(myItem){&lt;br /&gt;
    myItem.next().fadeOut(250);&lt;br /&gt;
    myItem.parent().removeClass(&amp;quot;topLine&amp;quot;);&lt;br /&gt;
    //hideAllItems();&lt;br /&gt;
    //myItem.find(&amp;quot;span:last&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
// --&amp;gt;&lt;br /&gt;
	/*]]&amp;gt;*/&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Media:Maphilight-sample01.zip]]‎&lt;br /&gt;
&lt;br /&gt;
Hinweis: damit fadeIn oder show funktionieren indem jQuery den Stil display: none und display: block hinzufügt. Eventuell muß das Element zuerst mit hide() o.ä. versteckt werden. Z.B.:&lt;br /&gt;
 $(&amp;quot;.myElement&amp;quot;).hide().fadeIn(500);&lt;br /&gt;
vorsicht mit visibility: hidden im CSS. Dies führt dazu, daß man das Element trotz show() nicht sieht.&lt;br /&gt;
&lt;br /&gt;
===Append Site Overlay DIV===&lt;br /&gt;
&lt;br /&gt;
Quelle: http://css-tricks.com/snippets/jquery/append-site-overlay-div/ (11/2011)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
   var docHeight = $(document).height();&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;body&amp;quot;).append(&amp;quot;&amp;lt;div id=&amp;#039;overlay&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;#overlay&amp;quot;)&lt;br /&gt;
      .height(docHeight)&lt;br /&gt;
      .css({&lt;br /&gt;
         &amp;#039;opacity&amp;#039; : 0.4,&lt;br /&gt;
         &amp;#039;position&amp;#039;: &amp;#039;absolute&amp;#039;,&lt;br /&gt;
         &amp;#039;top&amp;#039;: 0,&lt;br /&gt;
         &amp;#039;left&amp;#039;: 0,&lt;br /&gt;
         &amp;#039;background-color&amp;#039;: &amp;#039;black&amp;#039;,&lt;br /&gt;
         &amp;#039;width&amp;#039;: &amp;#039;100%&amp;#039;,&lt;br /&gt;
         &amp;#039;z-index&amp;#039;: 5000&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== jQuery - overlay, modal box, lightbox, tooltips ===&lt;br /&gt;
Infos über die verschiedenen Möglichkeiten und die Unterschiede (Todo)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
=== Position eines Elements auslesen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// get Pos of act Item&lt;br /&gt;
var position = $(&amp;quot;#myElement&amp;quot;).offset();&lt;br /&gt;
//console.log(position);&lt;br /&gt;
&lt;br /&gt;
//set positon to other elements...&lt;br /&gt;
$(&amp;quot;#otherElement&amp;quot;).css(position);&lt;br /&gt;
$(&amp;quot;#anotherElement&amp;quot;).css(&amp;quot;top&amp;quot;,(position.top+5));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usability ==&lt;br /&gt;
=== Loading Icon bis Seite komplett geladen ist ===&lt;br /&gt;
Quelle: siehe Links&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;#039;UTF-8&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Simple Loader&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;style&amp;gt;&lt;br /&gt;
		/* This only works with JavaScript,&lt;br /&gt;
		   if it&amp;#039;s not present, don&amp;#039;t show loader */&lt;br /&gt;
		.no-js #loader { display: none;  }&lt;br /&gt;
		.js #loader { display: block; position: absolute; left: 100px; top: 0; }&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;script src=&amp;quot;https://github.com/Modernizr/Modernizr/raw/master/modernizr.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;script&amp;gt;&lt;br /&gt;
		// Wait for window load&lt;br /&gt;
		$(window).load(function() {&lt;br /&gt;
			// Animate loader off screen&lt;br /&gt;
			$(&amp;quot;#loader&amp;quot;).animate({&lt;br /&gt;
				top: -200&lt;br /&gt;
			}, 1500);&lt;br /&gt;
		});&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;download.png&amp;quot; id=&amp;quot;loader&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;http://farm6.static.flickr.com/5299/5400751421_55d49b2786_o.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
 $(&amp;#039;#gbreslib-details-wrap&amp;#039;).fadeTo(&amp;#039;slow&amp;#039;, 1,function() {scrollToAnchor(&amp;quot;gbres_details_anchor&amp;quot;);});&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
=== Attribute testen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
myAttr = $(this).attr(&amp;#039;myAttr&amp;#039;);&lt;br /&gt;
if (typeof myAttr !== typeof undefined &amp;amp;&amp;amp; myAttr !== false &amp;amp;&amp;amp; myAttr !== &amp;quot;false&amp;quot;) {&lt;br /&gt;
   // Attribut ist vorhanden und nicht &amp;quot;false&amp;quot; -&amp;gt; tu was&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_Sicherheit&amp;diff=20338</id>
		<title>PHP - Sicherheit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_Sicherheit&amp;diff=20338"/>
		<updated>2014-07-23T11:07:58Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Formularschutz==&lt;br /&gt;
&lt;br /&gt;
von http://www.danielfett.de/internet-und-opensource,artikel,web-sicherheit#Formularschutz (Zugriff 2014-7)&lt;br /&gt;
&lt;br /&gt;
===Sicherheit für Websites===&lt;br /&gt;
&lt;br /&gt;
Aus eigener Erfahrung weiß ich, dass selbst in hochwertigen Anwendungen immer wieder sehr &amp;quot;billige&amp;quot; Sicherheitslücken eingebaut sind, da die Programmierer nicht die Zeit haben, sich mit den Sicherheitsaspekten von PHP zu beschäftigen. Dieser Artikel soll helfen, das Sicherheitsbewusstsein zu stärken.&lt;br /&gt;
&lt;br /&gt;
===Worum gehts?===&lt;br /&gt;
&lt;br /&gt;
Der Untertitel dieses Artikels könnte lauten: &amp;quot;PHP/MySQL-Anwendungen hacken&amp;quot;, da im Folgenden typische Angriffe auf eben solche Applikationen beschrieben werden. Mein Hauptaugenmerk möchte ich aber auf deren Verhinderung legen. Aus eigener Erfahrung weiß ich, dass selbst in Business-Anwendungen immer wieder sehr &amp;quot;billige&amp;quot; Sicherheitslücken eingebaut sind, da die Programmierer nicht die Zeit haben, sich mit den Sicherheitsaspekten von PHP zu beschäftigen. Aber auch in dem Code erfahrener Entwickler tauchen zwischen schönen Templatesystem und übersichtlichen aber funktionalen Klassenstrukturen immer wieder böse Zeilen auf, die einem Angreifer Tür und Tor öffnen.&lt;br /&gt;
&lt;br /&gt;
===Einführung===&lt;br /&gt;
&lt;br /&gt;
Die beschriebenen Attacken lassen sich - bei einer fehlerhaften Implementierung - auf diversen Systemkonfigurationen ausführen. In den Ausführungen wird von PHP in Verbindung mit MySQL ausgegangen, eine häufig anzutreffende Konfiguration. &lt;br /&gt;
&lt;br /&gt;
Generell ein guter Anlaufspunkt bei PHP-Fragen und auch bei Sicherheitsfragen im Speziellen ist die PHP-FAQ.&lt;br /&gt;
&lt;br /&gt;
===GET und POST===&lt;br /&gt;
&lt;br /&gt;
Diese beiden sog. Methoden stellen Wege zur Verfügung, auf denen der Browser diverse Daten an eine Website übermitteln kann. Vom Programmierer werden hier meist wenige Werte vorgesehen, in Wahrheit steht es dem Browser und damit dem Benutzer, der ihn kontrolliert, aber völlig frei, welche Daten er übermittelt. Zur Manipulation der gesendeten Daten reicht es bei der GET-Methode, die URL zu verändern; aus http://www.example.com/index.php?name=Peter&amp;amp;nummer=15 kann ein Benutzer ohne besondere Fertigkeiten innerhalb von Sekunden http://www.example.com/index.php?name=&amp;amp;nummer=TEXT machen und damit evtl. schon eine Sicherheitslücke ausnutzen. &lt;br /&gt;
&lt;br /&gt;
Es ist wichtig zu wissen, dass in einer URL nicht alle Zeichen erlaubt sind. Wir gehen daher davon aus, dass der verwendete Browser Sonderzeichen - sofern nötig - automatisch in ihren Zeichencode umwandelt. Um die Lesbarkeit zu verbessern werde ich daher im Folgenden auf diese Zeichencodes verzichten. Bei Bedarf kann man unter Stichworten wie &amp;quot;URL encoding&amp;quot; bei Google entsprechende Informationen finden.&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Witze===&lt;br /&gt;
&lt;br /&gt;
====Bilderschutz====&lt;br /&gt;
&lt;br /&gt;
Eigentlich gehört das, was jetzt kommt, nicht wirklich hier hin. Es soll mehr als warnendes Beispiel dienen, wie wenig der Webseitenersteller den Browser eines Benutzers wirklich unter Kontrolle hat und verdeutlichen, dass JavaScript sich nicht für Sicherheitsrelevante Dinge einsetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Es gibt Seiten im Netz, auf denen darf man keinen Rechtsklick einsetzen. Entweder der Browser reagiert einfach nicht auf den Klick oder es kommt ein Fenster was soviel sagt wie &amp;quot;Rechtsklick verboten!&amp;quot;, &amp;quot;Alle Bilder (c) 2022 by ME!&amp;quot; oder ähnliches. Damit will der Ersteller der Seite verhindern, dass man Bilder mit Rechtsklick -&amp;gt; &amp;quot;Speichern unter&amp;quot; auf der lokalen Festplatte abspeichert. &lt;br /&gt;
&lt;br /&gt;
Was dabei jedoch übersehen wird: In dem Moment, in dem ich das Bild sehe, ist es bereits auf meiner Festplatte. Nämlich im Cache-Verzeichnis des Browsers. Außerdem muss das Bild ja nach wie vor abrufbar sein, es muss eine URL haben und damit ist es auch direkt erreichbar; Meist reicht es, das Bild einfach in die Adressleiste des Browsers zu ziehen und es erscheint komplett ungeschützt im Fenster. Auch das liesse sich verhindern, aber in allen Browser kann man auch JavaScript ausschalten. &lt;br /&gt;
&lt;br /&gt;
Im Firefox gibt es eine ganz besonders einfache Möglichkeit, alle Bilder bequem abzuspeichern: Extras, Seiteninformationen, Medien. Schwupps sieht der Benutzer alle Bilder und kann sie bequem abspeichern.&lt;br /&gt;
Wer an ein Bild ran will, kriegt es auch!&lt;br /&gt;
Diese Art von Pseudo-Schutz ist nur ein Ärgernis für Benutzer, die mit dem Rechtsklick navigieren (entweder Rechtsklick -&amp;gt; zurück oder mit Mausgesten). Sie zeugt von Inkompetenz seitens des Erbauers der Page.&lt;br /&gt;
&lt;br /&gt;
====Formularschutz====&lt;br /&gt;
&lt;br /&gt;
Oftmals werden Formulare im Web von JavaScript auf deren Validität, also das korrekte Ausfüllen durch den Benutzer geprüft. Das ist sinnvoll, weil man so sofort nach Klick auf den Absenden-Button ein Feedback erhält, ob man nichts vergessen hat.&lt;br /&gt;
Niemals auf JavaScript vertrauen!&lt;br /&gt;
Aber diese Prüfung darf keinesfalls die einzige sein, bevor die Daten z.B. von PHP-Code verarbeitet werden. Es muss immer zusätzlich in PHP oder mit vergleichbaren Mitteln serverseitig geprüft werden! Denn wie oben schon gilt: JavaScript kann ausgeschaltet sein oder man kann auf Browser treffen, die gar kein JavaScript können.&lt;br /&gt;
&lt;br /&gt;
====JavaScript-Zugriffsschutz====&lt;br /&gt;
&lt;br /&gt;
Du willst alleine mit JavaScript eine Passwortabfrage für eine Seite erstellen? Vergiss es, keine Chance. Auch wenn das richtige Passwort noch so kompliziert &amp;quot;verschlüsselt&amp;quot; im Code auftaucht, es ist leicht rauszufinden. Nur .htaccess oder sichere Lösungen in serverseitigen Sprachen erfüllen hier ihren Zweck. Alles andere ist sicherheitstechnische Homöopathie.&lt;br /&gt;
&lt;br /&gt;
===Mailformulare missbrauchen===&lt;br /&gt;
&lt;br /&gt;
Die zweitbekannteste Anwendung des Internets ist nach dem World Wide Web wohl E-Mail. Und beide tauchen dort gerne zusammen auf, wo der Seitenersteller sich z.B. ein Feedback von seinen Benutzern erhofft oder Dienste wie &amp;quot;Seite weiterempfehlen&amp;quot; angeboten werden. (Meiner Meinung nach eine der überflüssigsten Funktionen überhaupt, aber egal.) &lt;br /&gt;
&lt;br /&gt;
Im Grunde stellen diese Formulare damit meistens nur eine einfache Schnittstelle zum mail-Befehl von PHP dar. Um die dabei oft entstehende Sicherheitslücke zu kennen, muss man ein bisschen über Header bei E-Mails wissen: &lt;br /&gt;
&lt;br /&gt;
E-Mail-Header bestehen, wie man leicht z.B. im Thunderbird E-Mail-Client mit Strg+U oder in Outlook-Express mit Strg+F3 nachschauen kann, aus mehreren Zeilen, die jeweils mit einem Schlüsselwort anfangen und durch Absatzzeichen getrennt sind, z.B.&lt;br /&gt;
 To: frosch@see.de &lt;br /&gt;
 From: info@example.com &lt;br /&gt;
 Subject: Ich bin eine Betreffzeile&lt;br /&gt;
Die Formulare bieten in der Regel eine Möglichkeit, dass der Absender seine eigene Adresse eintippt und die Formularinhalte unter seinem Namen irgendwohin geschickt werden. &lt;br /&gt;
&lt;br /&gt;
In PHP sieht das dann z.B. so aus:&lt;br /&gt;
 mail($to, $subject, $text, &amp;quot;From: &amp;quot;.$from);&lt;br /&gt;
Dabei kommen $to, $subject, $text und $from direkt aus dem Formular. Im mail-Befehl kann man als viertes Argument beliebige Header angeben. Der Entwickler hat also an dieser Stelle einen From-Header, gefüllt mit der Eingabe des Benutzers, vorgsehen. &lt;br /&gt;
&lt;br /&gt;
Ein Angreifer könnte sich dies folgendermaßen zunutze machen: Er sendet für $from den Wert (ohne Anführungszeichen) &amp;quot;test@example.com\n\rBcc: spam-empfaenger@example.com&amp;quot;. Wobei \n und \r hier natürlich für die Zeichen mit den ASCII-Codes 13 und 10 stehen. Zusammen ergeben sie einen Zeilenumbruch (nach Windows-Art). &lt;br /&gt;
&lt;br /&gt;
Damit sorgt er dafür, dass an der Stelle, an der eigentlich nur ein From-Header stehen sollte, nun auch ein Bcc-Header steht. Mit diesem kann er den Inhalt der Mail an viele, beliebig wählbare Empfänger schicken - und damit die Server-Resourcen missbrauchen und dem Inhaber evtl. auch Ärger einbringen. &lt;br /&gt;
&lt;br /&gt;
Um das zu verhindern, genügt es im Grunde, aus sämtlichen Eingaben die Absatzzeichen auszufiltern, z.B. mit&lt;br /&gt;
 $checkedFrom = str_replace(array(&amp;quot;\n&amp;quot;, &amp;quot;\r&amp;quot;), &amp;#039;&amp;#039;, $from);&lt;br /&gt;
&lt;br /&gt;
===register_globals und was es bewirkt===&lt;br /&gt;
&lt;br /&gt;
Es gibt in der PHP.INI die Einstellung register_globals. Sie bewirkt, wie es in älteren PHP-Versionen auch Standard war, den Import sämtlicher externer Daten in den globalen Namensraum des Skripts. Alle Daten aus Cookies, Get, Post, Umgebung (Environment) und Sessions werden also als Variablen der Form $name einfach so bereitgestellt. Üblicherweise sollte der Zugriff auf diese Variablen immer über $_COOKIE, $_GET, $_POST(, $_REQUEST) und $_SERVER erfolgen!&lt;br /&gt;
Abschalten - 1&lt;br /&gt;
&lt;br /&gt;
Diese Einstellung sollte dringen auf &amp;quot;off&amp;quot; stehen. Warum? Weil sonst - bei unsauberer Programmierung - dein Skript beeinflußt werden könnte an Stellen wo dies nicht gewünscht oder sogar gefährlich ist. Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if ($passwort == &amp;quot;okay&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    $loggedIn = true;&lt;br /&gt;
}&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
if ($loggedIn == true)&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird also eine Variable $loggedIn auf true gesetzt, sobald das Passwort stimmt. Stimmt es nicht, wird die Variable nicht gesetzt. Weiter unten wird dann geprüft ob die Variable auf true gesetzt ist - und dann davon ausgegangen, der User sei eingeloggt. &lt;br /&gt;
&lt;br /&gt;
Bei ordentlicher Programmierung wurde am Anfang des Skriptes error_reporting auf E_ALL gesetzt - damit käme bei Ausführung des unteren Teils eine Notice-Meldung, wenn der Benutzer nicht eingeloggt ist. Denn es wird dann ja eine Variable geprüft, die nicht vorher gesetzt wurde. Und dies könnte sich ein Hacker zunutze machen, indem er die PHP-Datei so aufruft:&lt;br /&gt;
index.php?loggedIn=1&lt;br /&gt;
- und schon wäre er drin. Also:&lt;br /&gt;
error_reporting(E_ALL) nervt, aber wirkt!&lt;br /&gt;
Stets Variablen vor der Benutzung einen definierten Wert zuweisen und vor allem&lt;br /&gt;
register_globals immer auf &amp;quot;off&amp;quot; stellen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gewöhnt man sich beides an, verbessert sich auch automatisch der Programmierstil :-)&lt;br /&gt;
&lt;br /&gt;
===Abschalten - 2===&lt;br /&gt;
&lt;br /&gt;
Aus einem ähnlichen Grund sollte man nie Session-Daten über eine mit register_globals registrierte Variable prüfen. Denn man weißt nicht sicher, ob die Variable wirklich Daten aus der Session enthält (denen man trauen kann) oder ob sie nicht doch eine verkappte GET- oder POST-Variable ist und damit evtl. manipulierte Inhalte hat.&lt;br /&gt;
&lt;br /&gt;
===Cookie-Daten-Integrität===&lt;br /&gt;
&lt;br /&gt;
Nur weil der normale Benutzer selten bis nie etwas von den Cookies einer Seite mitbekommt, heisst das für den Programmierer nicht, dass er den dort abgelegten Daten trauen darf.&lt;br /&gt;
Traue niemandem! Prüfe alle Eingaben!&lt;br /&gt;
(Diese Warnung ist zugegebenermaßen geklaut aus der PHP-FAQ, aber sehr eingängig!) &lt;br /&gt;
&lt;br /&gt;
Es ist für den Benutzer ein leichtes (z.B. mit entsprechenden FireFox-Plugins) die Daten in den Cookies zu verändern. Daher sollte man dort nie z.B. den Login-Status, die eingeloggte User-ID oder Passwörter speichern! Dafür gibt es Sessions, die erledigen das auf alle Fälle für dich.&lt;br /&gt;
eval is evil!&lt;br /&gt;
&lt;br /&gt;
Das folgende Code-Fragment hätte ich nie zu sehen bekommen, wenn es nicht genau dort gewesen wäre wo es war. Gleichzeitig ist es eines der fatalsten Code-Fragmente in Bezug auf PHP-Sicherheit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($HTTP_GET_VARS as $key =&amp;gt; $value) {&lt;br /&gt;
    eval(&amp;quot;$$key = \&amp;quot;$value\&amp;quot;;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was genau der Autor damit anstellen wollte, wird wohl ewig im Dunkeln bleiben. Fakt ist aber dass er mich damit dazu eingeladen hat, beliebige PHP-Befehle direkt aus der Adressleiste auszuführen. Als Beispiel stelle man sich vor, $value enthielte &amp;quot;;php_info();// womit man schon mal eine schöne Übersicht über die PHP-Installation bekommt. Das lässt sich dann mit ein wenig Kreativität und ein paar PHP-Funktionen ausbauen zu einer Dateiübersicht, der Anzeige von Dateien (z.B. der Datei, die eben diese Lücke enthält), dem Löschen von Dateien, Spam-Versand... etc.pp.. Von daher:&lt;br /&gt;
eval vermeiden wo immer möglich&lt;br /&gt;
(wie z.B. in dem gezeigten Fall, wo das völlig überflüssig eingesetzt wurde) und vor allem&lt;br /&gt;
NIE NICHT NIE ungeprüfte Eingaben in eval&amp;#039;s packen!&lt;br /&gt;
denn&lt;br /&gt;
EVAL is EVIL!&lt;br /&gt;
und es geht eben meist auch ohne...&lt;br /&gt;
&lt;br /&gt;
===MySQL-Injections===&lt;br /&gt;
&lt;br /&gt;
...sind eigentlich ganz einfach, eine entsprechend nachlässige Programmierung vorausgesetzt.&lt;br /&gt;
Für Anfänger...&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel: Angnommen wir haben ein ganz normales Login-Formular, also so mit Benutzername und Passwort und so. Damit erhält der Benutzer, der eine richtige Kombination aus Passwort und Benutzername eintippt Zugang zu einem geschützten Bereich. Der Programmierer prüft das folgendermaßen: ($_REQUEST[&amp;#039;passwort&amp;#039;] und $_REQUEST[&amp;#039;benutzername&amp;#039;] enthalten die Daten aus dem Login-Formular)&lt;br /&gt;
mysql_query(&amp;#039;SELECT * FROM users WHERE passwort = &amp;quot;&amp;#039;.$_REQUEST[&amp;#039;passwort&amp;#039;].&amp;#039;&amp;quot; AND username = &amp;quot;&amp;#039;.$_REQUEST[&amp;#039;benutzername&amp;#039;].&amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
Hier wird geprüft, ob eine Kombination aus Benutzername und Passwort in der Datenbank sind. Auch wenn man mal davon absieht, dass Passwörter nie in Klartext in eine Datenbank gehören wird hier eine Einladung für Angreifer ausgesprochen. Als Beispiel für einen Hack sei die Standard-MySQL-Injection für Benutzername und Passwort genannt: &amp;quot; OR 1 OR &amp;quot; in beide Felder eintippen und man ist drin. Geht mit erstaunlich vielen Seiten! Alternativ natürlich noch einfache Anführungszeichen statt doppelten. &lt;br /&gt;
&lt;br /&gt;
Netterweise ist der Account, der dabei SELECTet wird, meistens auch noch ein Administrator-Account...&lt;br /&gt;
...und Fortgeschrittene.&lt;br /&gt;
&lt;br /&gt;
Etwas mehr Kreativität seitens des Eindringlings erfordert folgendes Beispiel, welches im Ernstfall aber auch wesentlich größere Konsequenzen hat. &lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einem Formular in dem ein Benutzer seine ICQ-Nummer ändern kann. $_REQUEST[&amp;#039;icq&amp;#039;] enthalte daher seine Eingabe, für $username sei bereits sichergestellt dass der richtige Benutzername enthalten ist.&lt;br /&gt;
 mysql_query(&amp;#039;UPDATE users SET icqNummer = &amp;quot;&amp;#039;.$_REQUEST[&amp;#039;icq&amp;#039;].&amp;#039;&amp;quot; WHERE username = &amp;quot;&amp;#039;.$username.&amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
Damit hat der Programmierer einem Angreifer bereits alle Möglichkeiten in die Hand gegeben, die Daten in der Datenbank beliebig zu verändern. Ein Beispiel? Bitte:&lt;br /&gt;
 &amp;quot;, is_admin=&amp;quot;1&lt;br /&gt;
eingeben und schon hat man Admin-Rechte, vorausgesetzt der Programmierer hat eine Spalte is_admin vorgesehen, die angibt ob ein Benutzer Administratorrechte hat. Da allerdings, wenn überhaupt solche Spalten vorhanden sind, diese meist nicht all zu kreative Namen haben, kann man hier mit ein wenig Herumraten schon oft etwas erreichen. &lt;br /&gt;
&lt;br /&gt;
Will ein Eindringling nur etwas Schaden anrichten, wird er sich daran erinnern, dass man mit # in MySQL Kommentare anfängt. Daher eignet sich folgende Eingabe von ihm, um allen Benutzern Admin-Rechte zu geben:&lt;br /&gt;
 &amp;quot;, is_admin=&amp;quot;1&amp;quot; #&lt;br /&gt;
Auch schön, oder? &lt;br /&gt;
&lt;br /&gt;
Will er großen Schaden anrichten, macht er das Ganze in einem DELETE-Statement.&lt;br /&gt;
&lt;br /&gt;
===Vorbeugen!===&lt;br /&gt;
&lt;br /&gt;
Um solche Angriffe zu verhindern, muss man sich vor allem an&lt;br /&gt;
Traue niemandem! Prüfe alle Eingaben!&lt;br /&gt;
erinnern. Also: Numerische Werte z.B. mit (int) zu einem Integer casten, um sicherzustellen dass wirklich keine unerlaubten Zeichen enthalten sind. Z.B. so:&lt;br /&gt;
 $checkedValue = (int)$_REQUEST[&amp;#039;value&amp;#039;];&lt;br /&gt;
Wie man beispielsweise String-Werte und die Rückgabewerte aus Select-Boxen prüft, steht in der PHP-FAQ. &lt;br /&gt;
&lt;br /&gt;
Auf der sicheren Seite ist man insbesondere bei Eingabestrings, wenn man mysql_escape_string() bzw. das neuere mysql_real_escape_string() anwendet. Die oben gezeigten Abfragen in der sicheren Version lauten also:&lt;br /&gt;
 mysql_query(&amp;#039;SELECT * FROM users WHERE passwort = &amp;quot;&amp;#039;.mysql_real_escape_string($_REQUEST[&amp;#039;passwort&amp;#039;]).&amp;#039;&amp;quot; AND username = &amp;quot;&amp;#039;.mysql_real_escape_string($_REQUEST[&amp;#039;benutzername&amp;#039;]).&amp;#039;&amp;quot;&amp;#039;); &lt;br /&gt;
 mysql_query(&amp;#039;UPDATE users SET icqNummer = &amp;quot;&amp;#039;.mysql_real_escape_string($_REQUEST[&amp;#039;icq&amp;#039;]).&amp;#039;&amp;quot; WHERE username = &amp;quot;&amp;#039;.$username.&amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
(Wobei man das natürlich alles noch schöner schreiben kann.)&lt;br /&gt;
&lt;br /&gt;
===Zombie-Includes===&lt;br /&gt;
&lt;br /&gt;
Mein persönlicher Favorit unter den Sicherheitslücken sind aber amoklaufende Includes, die wieder mal nur funktionieren, weil jemand die Eingabedaten nicht richtig prüft.&lt;br /&gt;
Finden...&lt;br /&gt;
&lt;br /&gt;
Auffällig werden Seiten mit solchen Schwachstellen in der URL:&lt;br /&gt;
 http://www.example.com/index.php?include=content/readme&lt;br /&gt;
Sieht &amp;quot;content/readme&amp;quot; nicht verdächtig nach einem Dateinamen aus? Nur ohne Dateiendung. Der Programmierer wird hier also eine Datei includen, die vom aktuellen Ordner aus gesehen im Ordner content liegt und mindestens mit readme anfängt. Es wird wohl eine feste Dateiendung geben, die er immer an den angegebenen Pfad dranhängt. Also könnte obiges Konstrukt z.B. auf /content/readme.txt verweisen. &lt;br /&gt;
&lt;br /&gt;
Sein Code könnte z.B. so aussehen:&lt;br /&gt;
 include($_REQUEST[&amp;#039;include&amp;#039;].&amp;#039;.txt&amp;#039;);&lt;br /&gt;
Machen wir ein paar Versuche!&lt;br /&gt;
 http://www.example.com/index.php?include=content/readmeBLABLA&lt;br /&gt;
sollte eine Datei sein, die nicht existiert. Wenn wir Glück haben, wird eine entsprechende Fehlermeldung ausgegeben.&lt;br /&gt;
 http://www.example.com/index.php?include=index.php%00&lt;br /&gt;
Könnte, mit etwas Glück, die index.php in sich selber einbinden. Denn: Das %00 in einer URL sendet PHP das ASCII-Zeichen mit Code 0 - und das schneidet Strings ab. Daher wird die Dateiendung, die der Autor hinzufügt, auch abgeschnitten. Was wir nicht wissen ist, ob er vielleicht noch einen Text vorne an den angegebenen Namen anfügt, dann sähe sein Code so aus:&lt;br /&gt;
 include(&amp;#039;inc/&amp;#039;.$_REQUEST[&amp;#039;include&amp;#039;].&amp;#039;.txt&amp;#039;);&lt;br /&gt;
Dann gehen oben beschrieben Attacken natürlich nicht mehr. Stattdessen müsste man sich in diesem Fall mit .. durch die Verzeichnisstruktur hangeln um so an andere Dateien zu kommen. &lt;br /&gt;
&lt;br /&gt;
Noch viel gefährlicher ist die Tatsache, dass man unter Umständen bei der Version ohne Verzeichnisangabe Code von externen Quellen ausführen kann - damit stehen einem Angreifer endgültig Tür und Tor offen.&lt;br /&gt;
&lt;br /&gt;
===...und vermeiden!===&lt;br /&gt;
&lt;br /&gt;
Wieder bedeutet die Lösung für dieses Problem nicht viel Aufwand: mit str_replace werden sämtliche Slashes aus der Eingabe abgefangen, zur Sicherheit auch Backslashes und Punkte:&lt;br /&gt;
 $safeInclude = str_replace(array(&amp;#039;/&amp;#039;, &amp;#039;\/&amp;#039;, &amp;#039;.&amp;#039;), $_REQUEST[&amp;#039;include&amp;#039;]);&lt;br /&gt;
Natürlich muss die Seite so gebaut sein, dass sie eben ohne diese Zeichen in der übergebenen Variablen auskommt! &lt;br /&gt;
&lt;br /&gt;
Auf Nummer Sicher geht man aber, wenn man statt des Dateinamens nur ein Kürzel übergibt, das mittels eines Arrays den Dateinamen ermittelt.&lt;br /&gt;
File-Uploads&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit für Hacker, eigenen Code auf fremden Systemen auszuführen bilden immer wieder Dateiuploads. Welche Gefahr fremde Daten auf dem eigenen Server darstellen scheint vielen Programmierern nicht bewusst zu sein. In der Regel werden die Uploads z.B. für eine Bilder-Galerie vorgesehen und der Autor rechnet nicht damit, dass man nicht nur Bilder hochladen kann. &lt;br /&gt;
&lt;br /&gt;
Für einen erfolgreichen Upload eigener Skripte müssen einige Voraussetzungen erfüllt sein:&lt;br /&gt;
Der Autor nimmt in seinem Skript keine Prüfung des Dateiinhalts vor. Dies würde er z.B. durch Bestimmung der Bildgröße der hochgeladenen Datei sehr sicher erreichen (in PHP getimagesize). &lt;br /&gt;
&lt;br /&gt;
Der Autor muss fahrlässigerweise den Dateinamen verwenden, der ihm vom Client mitgesendet wird. Dies ist grundsätzlich ein Fehler. Abgesehen davon, dass es alles andere als verlässlich ist, ermöglicht es wie in diesem Falle dem Angreifer umfangreiche Manipulationsmöglichkeiten. &lt;br /&gt;
&lt;br /&gt;
Der Angreifer muss das Ziel kennen, wohin die Datei nach dem Upload verschoben wird. Außerdem muss dieses unterhalb des document root liegen, also in einem aus dem Web zugänglichen Bereich. &lt;br /&gt;
&lt;br /&gt;
Dann kann der Hacker also eine Datei nach seinen Wünschen hochladen und, da er ihr ja eine individuelle Endung verpassen kann, diese auch ausführen. Denkbar ist auch, dass wenn Punkt 2 und die Einschränkung von Punkt 3 nicht zutreffen, er mittels eines &amp;quot;offen stehenden&amp;quot; includes (Siehe vorangegangenen Abschnitt) eine Datei ausführt, die nicht im document root liegt und die evtl. noch eine Endung wie .gif trägt. Daher ist bei Dateiuploads immer höchste Vorsicht geboten!&lt;br /&gt;
Abwehrstrategien&lt;br /&gt;
&lt;br /&gt;
Man kann auch vorsorglich einige Maßnahmen treffen, um es gar nicht erst zum Versuch eines Angriffs kommen zu lassen. Bots erkennen dann nicht mehr, an welcher Stelle sie angreifen müssten und Menschen vergeht schnell die Lust am Herumexperimentieren wenn kein Erfolg zu sehen ist.&lt;br /&gt;
Verwirre deinen Gegner!&lt;br /&gt;
&lt;br /&gt;
Das Apache-Modul mod_rewrite ermöglicht es, Aufrufe wie www.example.com/df_maoam auf eine URL wie www.example.com/index.php?f=maoam &amp;quot;zeigen zu lassen&amp;quot;. (Vielleicht wirft der ein oder andere an diese Stelle zurecht einen Blick in die Adresszeile seines Browsers.) Bei jedem Aufruf einer Seite wird also der Webserver eine URL, die mit df_ beginnt in einen Aufruf der index.php umwandeln. Für den Browser des Besuchers und den Besucher selbst geschieht das transparent, d.h. sie bekommen nicht mit, dass hier in echt eine andere Seite aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
Dieses Mapping wird z.B. in einer .htaccess-Datei festgelegt und sieht für das Beispiel so aus:&lt;br /&gt;
 RewriteEngine On &lt;br /&gt;
 RewriteRule ^df_$ index.php &lt;br /&gt;
 RewriteRule ^df_([^\.]+)$ index.php?f=$1&lt;br /&gt;
Der Kenner sieht natürlich, dass es sich bei dem Zeichenwirrwar in der zweiten und dritten Zeile um einen regulären Ausdruck handelt - und wie die gebildet werden findet man nebenan im Regex-Tutorial. &lt;br /&gt;
&lt;br /&gt;
Mit mod_rewrite kann man lustige Sachen machen, aber man verliert auch genau so schnell mal gerne den Überblick, was man da eigentlich gemacht hat. Eine komplette Anleitung gibt es natürlich auch, und die Zitate am Anfang sind ernst zu nehmen!&lt;br /&gt;
&lt;br /&gt;
===Täuschen und Tarnen===&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Mittel ist das Verstecken von PHP. Nur mit HTML gestaltete Sites sind sicherlich ein wesentlich unattraktiveres Angriffsziel als interaktive. Um PHP zu verstecken sind im Grunde nur zwei Schritte nötig:&lt;br /&gt;
Umstellung der Standard-Dateierweiterung für PHP: Sag deinem Webserver, er solle ab sofort auch z.B. .html-Dateien mit PHP bearbeiten. Wie das genau geht, findet sich z.b. in der PHP-Installationsanleitung. Damit erreichst du, dass deine PHP-Dateien auch .html heissen können und damit nicht mehr interessant aussehen. Natürlich verlangsamt das deinen Server, wenn du wirklich einige HTML-Seiten hast, die gar kein PHP enthalten. &lt;br /&gt;
&lt;br /&gt;
PHP verstecken: Standardmäßig fügt PHP einen Header mit der verwendeten PHP-Version in die Ausgabe mit ein. Diesen kannst du mit der Einstellung&lt;br /&gt;
 expose_php = On&lt;br /&gt;
in der PHP.INI deaktivieren.&lt;br /&gt;
Beide Maßnahmen sind allerdings nur als kleine zusätzliche Vorkehrungen zu verstehen und bieten nicht all zu viel Sicherheit. Vor allem endet ihre Wirksamkeit dort, wo GET-Parameter in der URL auftauchen, ganz offensichtlich dynamische Inhalte vorliegen oder PHP-Fehlermeldungen angzeigt werden.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Einstellungen der PHP.INI===&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei von PHP, der PHP.INI findest du einige Einstellungen, die wesentlich zur Sicherheit beitragen können:&lt;br /&gt;
 register_globals = Off &lt;br /&gt;
Wie oben schon mehrmals gezeigt: Diese Einstellung sollte unbedingt so und nicht anders konfiguriert sein. &lt;br /&gt;
&lt;br /&gt;
 display_errors = Off &lt;br /&gt;
Verhindert dass Fehlermeldungen am Bildschirm zusammen mit der Ausgabe des Skriptes angezeigt werden. Diese könnten Pfade, Datenbank(zugangs)daten und ähnliches beinhalten, was für einen Hack nützlich sein könnte. Selbstverständlich sollte diese Einstellung auf deinem Entwicklungssystem nicht gesetzt sein. &lt;br /&gt;
&lt;br /&gt;
 error_reporting = E_ALL &lt;br /&gt;
auf dem Entwicklungssystem zeigt dir beim Schreiben eines Skriptes auf, wo du evtl. uninitialisierte Variablen benutzt. Weiter oben wird beschrieben, wie diese sich für einen Hack ausnutzen lassen. &lt;br /&gt;
&lt;br /&gt;
===Meldung erstatten!===&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle wirds dann schon leicht paranoid. Hast du mit Angriffen zu rechnen, lasse dir fehlgeschlagene MySQL-Queries, Parameter die durch die Eingangsprüfung am Anfang des Skriptes durchgefallen sind und fehlgeschlagene Logins direkt per E-Mail zusammen mit allen Daten, die du vom Verursache zusammenkratzen kannst (IP-Adresse, Browser etc.pp.) zusenden. &lt;br /&gt;
&lt;br /&gt;
Klingt gut, hat aber zwei Design-Schwächen: Erstens kann ein Angreifer seine Identität locker verstecken. Zweitens könnte er genau diese Form von &amp;quot;Error Reporting&amp;quot; für einen Denial-of-Service Angriff nutzen indem er dein Postfach mit Mails zumüllt und deinen Server durch das massenhafte Versenden von Mails lahmlegt. &lt;br /&gt;
&lt;br /&gt;
Wenn man auf das Live-Feeling verzichten kann, ist es daher besser, solche Benachrichtigungen in einem Logfile abzuspeichern. &lt;br /&gt;
&lt;br /&gt;
Bitte beachte, dass ich aus Zeitgründen keine Fragen zu Web-Sicherheit in den Kommentaren beantworten kann.&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_Sicherheit&amp;diff=20337</id>
		<title>PHP - Sicherheit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_Sicherheit&amp;diff=20337"/>
		<updated>2014-07-23T11:07:11Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: Die Seite wurde neu angelegt: „Formularschutz  von http://www.danielfett.de/internet-und-opensource,artikel,web-sicherheit#Formularschutz (Zugriff 2014-7)  Sicherheit für Websites  Aus eigener…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formularschutz&lt;br /&gt;
&lt;br /&gt;
von http://www.danielfett.de/internet-und-opensource,artikel,web-sicherheit#Formularschutz (Zugriff 2014-7)&lt;br /&gt;
&lt;br /&gt;
Sicherheit für Websites&lt;br /&gt;
&lt;br /&gt;
Aus eigener Erfahrung weiß ich, dass selbst in hochwertigen Anwendungen immer wieder sehr &amp;quot;billige&amp;quot; Sicherheitslücken eingebaut sind, da die Programmierer nicht die Zeit haben, sich mit den Sicherheitsaspekten von PHP zu beschäftigen. Dieser Artikel soll helfen, das Sicherheitsbewusstsein zu stärken.&lt;br /&gt;
&lt;br /&gt;
Vorbereitung&lt;br /&gt;
&lt;br /&gt;
Worum gehts?&lt;br /&gt;
Einführung&lt;br /&gt;
GET und POST&lt;br /&gt;
JavaScript-Witze&lt;br /&gt;
Bilderschutz&lt;br /&gt;
Formularschutz&lt;br /&gt;
JavaScript-Zugriffsschutz&lt;br /&gt;
Mailformulare missbrauchen&lt;br /&gt;
register_globals und was es bewirkt&lt;br /&gt;
Abschalten - 1&lt;br /&gt;
Abschalten - 2&lt;br /&gt;
Cookie-Daten-Integrität&lt;br /&gt;
eval is evil!&lt;br /&gt;
MySQL-Injections&lt;br /&gt;
Für Anfänger...&lt;br /&gt;
...und Fortgeschrittene.&lt;br /&gt;
Vorbeugen!&lt;br /&gt;
Zombie-Includes&lt;br /&gt;
Finden...&lt;br /&gt;
...und vermeiden!&lt;br /&gt;
File-Uploads&lt;br /&gt;
Abwehrstrategien&lt;br /&gt;
Verwirre deinen Gegner!&lt;br /&gt;
Täuschen und Tarnen&lt;br /&gt;
Wichtige Einstellungen der PHP.INI&lt;br /&gt;
Meldung erstatten!&lt;br /&gt;
Vorbereitung&lt;br /&gt;
&lt;br /&gt;
===Worum gehts?===&lt;br /&gt;
&lt;br /&gt;
Der Untertitel dieses Artikels könnte lauten: &amp;quot;PHP/MySQL-Anwendungen hacken&amp;quot;, da im Folgenden typische Angriffe auf eben solche Applikationen beschrieben werden. Mein Hauptaugenmerk möchte ich aber auf deren Verhinderung legen. Aus eigener Erfahrung weiß ich, dass selbst in Business-Anwendungen immer wieder sehr &amp;quot;billige&amp;quot; Sicherheitslücken eingebaut sind, da die Programmierer nicht die Zeit haben, sich mit den Sicherheitsaspekten von PHP zu beschäftigen. Aber auch in dem Code erfahrener Entwickler tauchen zwischen schönen Templatesystem und übersichtlichen aber funktionalen Klassenstrukturen immer wieder böse Zeilen auf, die einem Angreifer Tür und Tor öffnen.&lt;br /&gt;
&lt;br /&gt;
===Einführung===&lt;br /&gt;
&lt;br /&gt;
Die beschriebenen Attacken lassen sich - bei einer fehlerhaften Implementierung - auf diversen Systemkonfigurationen ausführen. In den Ausführungen wird von PHP in Verbindung mit MySQL ausgegangen, eine häufig anzutreffende Konfiguration. &lt;br /&gt;
&lt;br /&gt;
Generell ein guter Anlaufspunkt bei PHP-Fragen und auch bei Sicherheitsfragen im Speziellen ist die PHP-FAQ.&lt;br /&gt;
&lt;br /&gt;
===GET und POST===&lt;br /&gt;
&lt;br /&gt;
Diese beiden sog. Methoden stellen Wege zur Verfügung, auf denen der Browser diverse Daten an eine Website übermitteln kann. Vom Programmierer werden hier meist wenige Werte vorgesehen, in Wahrheit steht es dem Browser und damit dem Benutzer, der ihn kontrolliert, aber völlig frei, welche Daten er übermittelt. Zur Manipulation der gesendeten Daten reicht es bei der GET-Methode, die URL zu verändern; aus http://www.example.com/index.php?name=Peter&amp;amp;nummer=15 kann ein Benutzer ohne besondere Fertigkeiten innerhalb von Sekunden http://www.example.com/index.php?name=&amp;amp;nummer=TEXT machen und damit evtl. schon eine Sicherheitslücke ausnutzen. &lt;br /&gt;
&lt;br /&gt;
Es ist wichtig zu wissen, dass in einer URL nicht alle Zeichen erlaubt sind. Wir gehen daher davon aus, dass der verwendete Browser Sonderzeichen - sofern nötig - automatisch in ihren Zeichencode umwandelt. Um die Lesbarkeit zu verbessern werde ich daher im Folgenden auf diese Zeichencodes verzichten. Bei Bedarf kann man unter Stichworten wie &amp;quot;URL encoding&amp;quot; bei Google entsprechende Informationen finden.&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Witze===&lt;br /&gt;
&lt;br /&gt;
====Bilderschutz====&lt;br /&gt;
&lt;br /&gt;
Eigentlich gehört das, was jetzt kommt, nicht wirklich hier hin. Es soll mehr als warnendes Beispiel dienen, wie wenig der Webseitenersteller den Browser eines Benutzers wirklich unter Kontrolle hat und verdeutlichen, dass JavaScript sich nicht für Sicherheitsrelevante Dinge einsetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Es gibt Seiten im Netz, auf denen darf man keinen Rechtsklick einsetzen. Entweder der Browser reagiert einfach nicht auf den Klick oder es kommt ein Fenster was soviel sagt wie &amp;quot;Rechtsklick verboten!&amp;quot;, &amp;quot;Alle Bilder (c) 2022 by ME!&amp;quot; oder ähnliches. Damit will der Ersteller der Seite verhindern, dass man Bilder mit Rechtsklick -&amp;gt; &amp;quot;Speichern unter&amp;quot; auf der lokalen Festplatte abspeichert. &lt;br /&gt;
&lt;br /&gt;
Was dabei jedoch übersehen wird: In dem Moment, in dem ich das Bild sehe, ist es bereits auf meiner Festplatte. Nämlich im Cache-Verzeichnis des Browsers. Außerdem muss das Bild ja nach wie vor abrufbar sein, es muss eine URL haben und damit ist es auch direkt erreichbar; Meist reicht es, das Bild einfach in die Adressleiste des Browsers zu ziehen und es erscheint komplett ungeschützt im Fenster. Auch das liesse sich verhindern, aber in allen Browser kann man auch JavaScript ausschalten. &lt;br /&gt;
&lt;br /&gt;
Im Firefox gibt es eine ganz besonders einfache Möglichkeit, alle Bilder bequem abzuspeichern: Extras, Seiteninformationen, Medien. Schwupps sieht der Benutzer alle Bilder und kann sie bequem abspeichern.&lt;br /&gt;
Wer an ein Bild ran will, kriegt es auch!&lt;br /&gt;
Diese Art von Pseudo-Schutz ist nur ein Ärgernis für Benutzer, die mit dem Rechtsklick navigieren (entweder Rechtsklick -&amp;gt; zurück oder mit Mausgesten). Sie zeugt von Inkompetenz seitens des Erbauers der Page.&lt;br /&gt;
&lt;br /&gt;
====Formularschutz====&lt;br /&gt;
&lt;br /&gt;
Oftmals werden Formulare im Web von JavaScript auf deren Validität, also das korrekte Ausfüllen durch den Benutzer geprüft. Das ist sinnvoll, weil man so sofort nach Klick auf den Absenden-Button ein Feedback erhält, ob man nichts vergessen hat.&lt;br /&gt;
Niemals auf JavaScript vertrauen!&lt;br /&gt;
Aber diese Prüfung darf keinesfalls die einzige sein, bevor die Daten z.B. von PHP-Code verarbeitet werden. Es muss immer zusätzlich in PHP oder mit vergleichbaren Mitteln serverseitig geprüft werden! Denn wie oben schon gilt: JavaScript kann ausgeschaltet sein oder man kann auf Browser treffen, die gar kein JavaScript können.&lt;br /&gt;
&lt;br /&gt;
====JavaScript-Zugriffsschutz====&lt;br /&gt;
&lt;br /&gt;
Du willst alleine mit JavaScript eine Passwortabfrage für eine Seite erstellen? Vergiss es, keine Chance. Auch wenn das richtige Passwort noch so kompliziert &amp;quot;verschlüsselt&amp;quot; im Code auftaucht, es ist leicht rauszufinden. Nur .htaccess oder sichere Lösungen in serverseitigen Sprachen erfüllen hier ihren Zweck. Alles andere ist sicherheitstechnische Homöopathie.&lt;br /&gt;
&lt;br /&gt;
===Mailformulare missbrauchen===&lt;br /&gt;
&lt;br /&gt;
Die zweitbekannteste Anwendung des Internets ist nach dem World Wide Web wohl E-Mail. Und beide tauchen dort gerne zusammen auf, wo der Seitenersteller sich z.B. ein Feedback von seinen Benutzern erhofft oder Dienste wie &amp;quot;Seite weiterempfehlen&amp;quot; angeboten werden. (Meiner Meinung nach eine der überflüssigsten Funktionen überhaupt, aber egal.) &lt;br /&gt;
&lt;br /&gt;
Im Grunde stellen diese Formulare damit meistens nur eine einfache Schnittstelle zum mail-Befehl von PHP dar. Um die dabei oft entstehende Sicherheitslücke zu kennen, muss man ein bisschen über Header bei E-Mails wissen: &lt;br /&gt;
&lt;br /&gt;
E-Mail-Header bestehen, wie man leicht z.B. im Thunderbird E-Mail-Client mit Strg+U oder in Outlook-Express mit Strg+F3 nachschauen kann, aus mehreren Zeilen, die jeweils mit einem Schlüsselwort anfangen und durch Absatzzeichen getrennt sind, z.B.&lt;br /&gt;
 To: frosch@see.de &lt;br /&gt;
 From: info@example.com &lt;br /&gt;
 Subject: Ich bin eine Betreffzeile&lt;br /&gt;
Die Formulare bieten in der Regel eine Möglichkeit, dass der Absender seine eigene Adresse eintippt und die Formularinhalte unter seinem Namen irgendwohin geschickt werden. &lt;br /&gt;
&lt;br /&gt;
In PHP sieht das dann z.B. so aus:&lt;br /&gt;
 mail($to, $subject, $text, &amp;quot;From: &amp;quot;.$from);&lt;br /&gt;
Dabei kommen $to, $subject, $text und $from direkt aus dem Formular. Im mail-Befehl kann man als viertes Argument beliebige Header angeben. Der Entwickler hat also an dieser Stelle einen From-Header, gefüllt mit der Eingabe des Benutzers, vorgsehen. &lt;br /&gt;
&lt;br /&gt;
Ein Angreifer könnte sich dies folgendermaßen zunutze machen: Er sendet für $from den Wert (ohne Anführungszeichen) &amp;quot;test@example.com\n\rBcc: spam-empfaenger@example.com&amp;quot;. Wobei \n und \r hier natürlich für die Zeichen mit den ASCII-Codes 13 und 10 stehen. Zusammen ergeben sie einen Zeilenumbruch (nach Windows-Art). &lt;br /&gt;
&lt;br /&gt;
Damit sorgt er dafür, dass an der Stelle, an der eigentlich nur ein From-Header stehen sollte, nun auch ein Bcc-Header steht. Mit diesem kann er den Inhalt der Mail an viele, beliebig wählbare Empfänger schicken - und damit die Server-Resourcen missbrauchen und dem Inhaber evtl. auch Ärger einbringen. &lt;br /&gt;
&lt;br /&gt;
Um das zu verhindern, genügt es im Grunde, aus sämtlichen Eingaben die Absatzzeichen auszufiltern, z.B. mit&lt;br /&gt;
 $checkedFrom = str_replace(array(&amp;quot;\n&amp;quot;, &amp;quot;\r&amp;quot;), &amp;#039;&amp;#039;, $from);&lt;br /&gt;
&lt;br /&gt;
===register_globals und was es bewirkt===&lt;br /&gt;
&lt;br /&gt;
Es gibt in der PHP.INI die Einstellung register_globals. Sie bewirkt, wie es in älteren PHP-Versionen auch Standard war, den Import sämtlicher externer Daten in den globalen Namensraum des Skripts. Alle Daten aus Cookies, Get, Post, Umgebung (Environment) und Sessions werden also als Variablen der Form $name einfach so bereitgestellt. Üblicherweise sollte der Zugriff auf diese Variablen immer über $_COOKIE, $_GET, $_POST(, $_REQUEST) und $_SERVER erfolgen!&lt;br /&gt;
Abschalten - 1&lt;br /&gt;
&lt;br /&gt;
Diese Einstellung sollte dringen auf &amp;quot;off&amp;quot; stehen. Warum? Weil sonst - bei unsauberer Programmierung - dein Skript beeinflußt werden könnte an Stellen wo dies nicht gewünscht oder sogar gefährlich ist. Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if ($passwort == &amp;quot;okay&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    $loggedIn = true;&lt;br /&gt;
}&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
if ($loggedIn == true)&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird also eine Variable $loggedIn auf true gesetzt, sobald das Passwort stimmt. Stimmt es nicht, wird die Variable nicht gesetzt. Weiter unten wird dann geprüft ob die Variable auf true gesetzt ist - und dann davon ausgegangen, der User sei eingeloggt. &lt;br /&gt;
&lt;br /&gt;
Bei ordentlicher Programmierung wurde am Anfang des Skriptes error_reporting auf E_ALL gesetzt - damit käme bei Ausführung des unteren Teils eine Notice-Meldung, wenn der Benutzer nicht eingeloggt ist. Denn es wird dann ja eine Variable geprüft, die nicht vorher gesetzt wurde. Und dies könnte sich ein Hacker zunutze machen, indem er die PHP-Datei so aufruft:&lt;br /&gt;
index.php?loggedIn=1&lt;br /&gt;
- und schon wäre er drin. Also:&lt;br /&gt;
error_reporting(E_ALL) nervt, aber wirkt!&lt;br /&gt;
Stets Variablen vor der Benutzung einen definierten Wert zuweisen und vor allem&lt;br /&gt;
register_globals immer auf &amp;quot;off&amp;quot; stellen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gewöhnt man sich beides an, verbessert sich auch automatisch der Programmierstil :-)&lt;br /&gt;
&lt;br /&gt;
===Abschalten - 2===&lt;br /&gt;
&lt;br /&gt;
Aus einem ähnlichen Grund sollte man nie Session-Daten über eine mit register_globals registrierte Variable prüfen. Denn man weißt nicht sicher, ob die Variable wirklich Daten aus der Session enthält (denen man trauen kann) oder ob sie nicht doch eine verkappte GET- oder POST-Variable ist und damit evtl. manipulierte Inhalte hat.&lt;br /&gt;
&lt;br /&gt;
===Cookie-Daten-Integrität===&lt;br /&gt;
&lt;br /&gt;
Nur weil der normale Benutzer selten bis nie etwas von den Cookies einer Seite mitbekommt, heisst das für den Programmierer nicht, dass er den dort abgelegten Daten trauen darf.&lt;br /&gt;
Traue niemandem! Prüfe alle Eingaben!&lt;br /&gt;
(Diese Warnung ist zugegebenermaßen geklaut aus der PHP-FAQ, aber sehr eingängig!) &lt;br /&gt;
&lt;br /&gt;
Es ist für den Benutzer ein leichtes (z.B. mit entsprechenden FireFox-Plugins) die Daten in den Cookies zu verändern. Daher sollte man dort nie z.B. den Login-Status, die eingeloggte User-ID oder Passwörter speichern! Dafür gibt es Sessions, die erledigen das auf alle Fälle für dich.&lt;br /&gt;
eval is evil!&lt;br /&gt;
&lt;br /&gt;
Das folgende Code-Fragment hätte ich nie zu sehen bekommen, wenn es nicht genau dort gewesen wäre wo es war. Gleichzeitig ist es eines der fatalsten Code-Fragmente in Bezug auf PHP-Sicherheit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($HTTP_GET_VARS as $key =&amp;gt; $value) {&lt;br /&gt;
    eval(&amp;quot;$$key = \&amp;quot;$value\&amp;quot;;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was genau der Autor damit anstellen wollte, wird wohl ewig im Dunkeln bleiben. Fakt ist aber dass er mich damit dazu eingeladen hat, beliebige PHP-Befehle direkt aus der Adressleiste auszuführen. Als Beispiel stelle man sich vor, $value enthielte &amp;quot;;php_info();// womit man schon mal eine schöne Übersicht über die PHP-Installation bekommt. Das lässt sich dann mit ein wenig Kreativität und ein paar PHP-Funktionen ausbauen zu einer Dateiübersicht, der Anzeige von Dateien (z.B. der Datei, die eben diese Lücke enthält), dem Löschen von Dateien, Spam-Versand... etc.pp.. Von daher:&lt;br /&gt;
eval vermeiden wo immer möglich&lt;br /&gt;
(wie z.B. in dem gezeigten Fall, wo das völlig überflüssig eingesetzt wurde) und vor allem&lt;br /&gt;
NIE NICHT NIE ungeprüfte Eingaben in eval&amp;#039;s packen!&lt;br /&gt;
denn&lt;br /&gt;
EVAL is EVIL!&lt;br /&gt;
und es geht eben meist auch ohne...&lt;br /&gt;
&lt;br /&gt;
===MySQL-Injections===&lt;br /&gt;
&lt;br /&gt;
...sind eigentlich ganz einfach, eine entsprechend nachlässige Programmierung vorausgesetzt.&lt;br /&gt;
Für Anfänger...&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel: Angnommen wir haben ein ganz normales Login-Formular, also so mit Benutzername und Passwort und so. Damit erhält der Benutzer, der eine richtige Kombination aus Passwort und Benutzername eintippt Zugang zu einem geschützten Bereich. Der Programmierer prüft das folgendermaßen: ($_REQUEST[&amp;#039;passwort&amp;#039;] und $_REQUEST[&amp;#039;benutzername&amp;#039;] enthalten die Daten aus dem Login-Formular)&lt;br /&gt;
mysql_query(&amp;#039;SELECT * FROM users WHERE passwort = &amp;quot;&amp;#039;.$_REQUEST[&amp;#039;passwort&amp;#039;].&amp;#039;&amp;quot; AND username = &amp;quot;&amp;#039;.$_REQUEST[&amp;#039;benutzername&amp;#039;].&amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
Hier wird geprüft, ob eine Kombination aus Benutzername und Passwort in der Datenbank sind. Auch wenn man mal davon absieht, dass Passwörter nie in Klartext in eine Datenbank gehören wird hier eine Einladung für Angreifer ausgesprochen. Als Beispiel für einen Hack sei die Standard-MySQL-Injection für Benutzername und Passwort genannt: &amp;quot; OR 1 OR &amp;quot; in beide Felder eintippen und man ist drin. Geht mit erstaunlich vielen Seiten! Alternativ natürlich noch einfache Anführungszeichen statt doppelten. &lt;br /&gt;
&lt;br /&gt;
Netterweise ist der Account, der dabei SELECTet wird, meistens auch noch ein Administrator-Account...&lt;br /&gt;
...und Fortgeschrittene.&lt;br /&gt;
&lt;br /&gt;
Etwas mehr Kreativität seitens des Eindringlings erfordert folgendes Beispiel, welches im Ernstfall aber auch wesentlich größere Konsequenzen hat. &lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einem Formular in dem ein Benutzer seine ICQ-Nummer ändern kann. $_REQUEST[&amp;#039;icq&amp;#039;] enthalte daher seine Eingabe, für $username sei bereits sichergestellt dass der richtige Benutzername enthalten ist.&lt;br /&gt;
 mysql_query(&amp;#039;UPDATE users SET icqNummer = &amp;quot;&amp;#039;.$_REQUEST[&amp;#039;icq&amp;#039;].&amp;#039;&amp;quot; WHERE username = &amp;quot;&amp;#039;.$username.&amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
Damit hat der Programmierer einem Angreifer bereits alle Möglichkeiten in die Hand gegeben, die Daten in der Datenbank beliebig zu verändern. Ein Beispiel? Bitte:&lt;br /&gt;
 &amp;quot;, is_admin=&amp;quot;1&lt;br /&gt;
eingeben und schon hat man Admin-Rechte, vorausgesetzt der Programmierer hat eine Spalte is_admin vorgesehen, die angibt ob ein Benutzer Administratorrechte hat. Da allerdings, wenn überhaupt solche Spalten vorhanden sind, diese meist nicht all zu kreative Namen haben, kann man hier mit ein wenig Herumraten schon oft etwas erreichen. &lt;br /&gt;
&lt;br /&gt;
Will ein Eindringling nur etwas Schaden anrichten, wird er sich daran erinnern, dass man mit # in MySQL Kommentare anfängt. Daher eignet sich folgende Eingabe von ihm, um allen Benutzern Admin-Rechte zu geben:&lt;br /&gt;
 &amp;quot;, is_admin=&amp;quot;1&amp;quot; #&lt;br /&gt;
Auch schön, oder? &lt;br /&gt;
&lt;br /&gt;
Will er großen Schaden anrichten, macht er das Ganze in einem DELETE-Statement.&lt;br /&gt;
&lt;br /&gt;
===Vorbeugen!===&lt;br /&gt;
&lt;br /&gt;
Um solche Angriffe zu verhindern, muss man sich vor allem an&lt;br /&gt;
Traue niemandem! Prüfe alle Eingaben!&lt;br /&gt;
erinnern. Also: Numerische Werte z.B. mit (int) zu einem Integer casten, um sicherzustellen dass wirklich keine unerlaubten Zeichen enthalten sind. Z.B. so:&lt;br /&gt;
 $checkedValue = (int)$_REQUEST[&amp;#039;value&amp;#039;];&lt;br /&gt;
Wie man beispielsweise String-Werte und die Rückgabewerte aus Select-Boxen prüft, steht in der PHP-FAQ. &lt;br /&gt;
&lt;br /&gt;
Auf der sicheren Seite ist man insbesondere bei Eingabestrings, wenn man mysql_escape_string() bzw. das neuere mysql_real_escape_string() anwendet. Die oben gezeigten Abfragen in der sicheren Version lauten also:&lt;br /&gt;
 mysql_query(&amp;#039;SELECT * FROM users WHERE passwort = &amp;quot;&amp;#039;.mysql_real_escape_string($_REQUEST[&amp;#039;passwort&amp;#039;]).&amp;#039;&amp;quot; AND username = &amp;quot;&amp;#039;.mysql_real_escape_string($_REQUEST[&amp;#039;benutzername&amp;#039;]).&amp;#039;&amp;quot;&amp;#039;); &lt;br /&gt;
 mysql_query(&amp;#039;UPDATE users SET icqNummer = &amp;quot;&amp;#039;.mysql_real_escape_string($_REQUEST[&amp;#039;icq&amp;#039;]).&amp;#039;&amp;quot; WHERE username = &amp;quot;&amp;#039;.$username.&amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
(Wobei man das natürlich alles noch schöner schreiben kann.)&lt;br /&gt;
&lt;br /&gt;
===Zombie-Includes===&lt;br /&gt;
&lt;br /&gt;
Mein persönlicher Favorit unter den Sicherheitslücken sind aber amoklaufende Includes, die wieder mal nur funktionieren, weil jemand die Eingabedaten nicht richtig prüft.&lt;br /&gt;
Finden...&lt;br /&gt;
&lt;br /&gt;
Auffällig werden Seiten mit solchen Schwachstellen in der URL:&lt;br /&gt;
 http://www.example.com/index.php?include=content/readme&lt;br /&gt;
Sieht &amp;quot;content/readme&amp;quot; nicht verdächtig nach einem Dateinamen aus? Nur ohne Dateiendung. Der Programmierer wird hier also eine Datei includen, die vom aktuellen Ordner aus gesehen im Ordner content liegt und mindestens mit readme anfängt. Es wird wohl eine feste Dateiendung geben, die er immer an den angegebenen Pfad dranhängt. Also könnte obiges Konstrukt z.B. auf /content/readme.txt verweisen. &lt;br /&gt;
&lt;br /&gt;
Sein Code könnte z.B. so aussehen:&lt;br /&gt;
 include($_REQUEST[&amp;#039;include&amp;#039;].&amp;#039;.txt&amp;#039;);&lt;br /&gt;
Machen wir ein paar Versuche!&lt;br /&gt;
 http://www.example.com/index.php?include=content/readmeBLABLA&lt;br /&gt;
sollte eine Datei sein, die nicht existiert. Wenn wir Glück haben, wird eine entsprechende Fehlermeldung ausgegeben.&lt;br /&gt;
 http://www.example.com/index.php?include=index.php%00&lt;br /&gt;
Könnte, mit etwas Glück, die index.php in sich selber einbinden. Denn: Das %00 in einer URL sendet PHP das ASCII-Zeichen mit Code 0 - und das schneidet Strings ab. Daher wird die Dateiendung, die der Autor hinzufügt, auch abgeschnitten. Was wir nicht wissen ist, ob er vielleicht noch einen Text vorne an den angegebenen Namen anfügt, dann sähe sein Code so aus:&lt;br /&gt;
 include(&amp;#039;inc/&amp;#039;.$_REQUEST[&amp;#039;include&amp;#039;].&amp;#039;.txt&amp;#039;);&lt;br /&gt;
Dann gehen oben beschrieben Attacken natürlich nicht mehr. Stattdessen müsste man sich in diesem Fall mit .. durch die Verzeichnisstruktur hangeln um so an andere Dateien zu kommen. &lt;br /&gt;
&lt;br /&gt;
Noch viel gefährlicher ist die Tatsache, dass man unter Umständen bei der Version ohne Verzeichnisangabe Code von externen Quellen ausführen kann - damit stehen einem Angreifer endgültig Tür und Tor offen.&lt;br /&gt;
&lt;br /&gt;
===...und vermeiden!===&lt;br /&gt;
&lt;br /&gt;
Wieder bedeutet die Lösung für dieses Problem nicht viel Aufwand: mit str_replace werden sämtliche Slashes aus der Eingabe abgefangen, zur Sicherheit auch Backslashes und Punkte:&lt;br /&gt;
 $safeInclude = str_replace(array(&amp;#039;/&amp;#039;, &amp;#039;\/&amp;#039;, &amp;#039;.&amp;#039;), $_REQUEST[&amp;#039;include&amp;#039;]);&lt;br /&gt;
Natürlich muss die Seite so gebaut sein, dass sie eben ohne diese Zeichen in der übergebenen Variablen auskommt! &lt;br /&gt;
&lt;br /&gt;
Auf Nummer Sicher geht man aber, wenn man statt des Dateinamens nur ein Kürzel übergibt, das mittels eines Arrays den Dateinamen ermittelt.&lt;br /&gt;
File-Uploads&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit für Hacker, eigenen Code auf fremden Systemen auszuführen bilden immer wieder Dateiuploads. Welche Gefahr fremde Daten auf dem eigenen Server darstellen scheint vielen Programmierern nicht bewusst zu sein. In der Regel werden die Uploads z.B. für eine Bilder-Galerie vorgesehen und der Autor rechnet nicht damit, dass man nicht nur Bilder hochladen kann. &lt;br /&gt;
&lt;br /&gt;
Für einen erfolgreichen Upload eigener Skripte müssen einige Voraussetzungen erfüllt sein:&lt;br /&gt;
Der Autor nimmt in seinem Skript keine Prüfung des Dateiinhalts vor. Dies würde er z.B. durch Bestimmung der Bildgröße der hochgeladenen Datei sehr sicher erreichen (in PHP getimagesize). &lt;br /&gt;
&lt;br /&gt;
Der Autor muss fahrlässigerweise den Dateinamen verwenden, der ihm vom Client mitgesendet wird. Dies ist grundsätzlich ein Fehler. Abgesehen davon, dass es alles andere als verlässlich ist, ermöglicht es wie in diesem Falle dem Angreifer umfangreiche Manipulationsmöglichkeiten. &lt;br /&gt;
&lt;br /&gt;
Der Angreifer muss das Ziel kennen, wohin die Datei nach dem Upload verschoben wird. Außerdem muss dieses unterhalb des document root liegen, also in einem aus dem Web zugänglichen Bereich. &lt;br /&gt;
&lt;br /&gt;
Dann kann der Hacker also eine Datei nach seinen Wünschen hochladen und, da er ihr ja eine individuelle Endung verpassen kann, diese auch ausführen. Denkbar ist auch, dass wenn Punkt 2 und die Einschränkung von Punkt 3 nicht zutreffen, er mittels eines &amp;quot;offen stehenden&amp;quot; includes (Siehe vorangegangenen Abschnitt) eine Datei ausführt, die nicht im document root liegt und die evtl. noch eine Endung wie .gif trägt. Daher ist bei Dateiuploads immer höchste Vorsicht geboten!&lt;br /&gt;
Abwehrstrategien&lt;br /&gt;
&lt;br /&gt;
Man kann auch vorsorglich einige Maßnahmen treffen, um es gar nicht erst zum Versuch eines Angriffs kommen zu lassen. Bots erkennen dann nicht mehr, an welcher Stelle sie angreifen müssten und Menschen vergeht schnell die Lust am Herumexperimentieren wenn kein Erfolg zu sehen ist.&lt;br /&gt;
Verwirre deinen Gegner!&lt;br /&gt;
&lt;br /&gt;
Das Apache-Modul mod_rewrite ermöglicht es, Aufrufe wie www.example.com/df_maoam auf eine URL wie www.example.com/index.php?f=maoam &amp;quot;zeigen zu lassen&amp;quot;. (Vielleicht wirft der ein oder andere an diese Stelle zurecht einen Blick in die Adresszeile seines Browsers.) Bei jedem Aufruf einer Seite wird also der Webserver eine URL, die mit df_ beginnt in einen Aufruf der index.php umwandeln. Für den Browser des Besuchers und den Besucher selbst geschieht das transparent, d.h. sie bekommen nicht mit, dass hier in echt eine andere Seite aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
Dieses Mapping wird z.B. in einer .htaccess-Datei festgelegt und sieht für das Beispiel so aus:&lt;br /&gt;
 RewriteEngine On &lt;br /&gt;
 RewriteRule ^df_$ index.php &lt;br /&gt;
 RewriteRule ^df_([^\.]+)$ index.php?f=$1&lt;br /&gt;
Der Kenner sieht natürlich, dass es sich bei dem Zeichenwirrwar in der zweiten und dritten Zeile um einen regulären Ausdruck handelt - und wie die gebildet werden findet man nebenan im Regex-Tutorial. &lt;br /&gt;
&lt;br /&gt;
Mit mod_rewrite kann man lustige Sachen machen, aber man verliert auch genau so schnell mal gerne den Überblick, was man da eigentlich gemacht hat. Eine komplette Anleitung gibt es natürlich auch, und die Zitate am Anfang sind ernst zu nehmen!&lt;br /&gt;
&lt;br /&gt;
===Täuschen und Tarnen===&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Mittel ist das Verstecken von PHP. Nur mit HTML gestaltete Sites sind sicherlich ein wesentlich unattraktiveres Angriffsziel als interaktive. Um PHP zu verstecken sind im Grunde nur zwei Schritte nötig:&lt;br /&gt;
Umstellung der Standard-Dateierweiterung für PHP: Sag deinem Webserver, er solle ab sofort auch z.B. .html-Dateien mit PHP bearbeiten. Wie das genau geht, findet sich z.b. in der PHP-Installationsanleitung. Damit erreichst du, dass deine PHP-Dateien auch .html heissen können und damit nicht mehr interessant aussehen. Natürlich verlangsamt das deinen Server, wenn du wirklich einige HTML-Seiten hast, die gar kein PHP enthalten. &lt;br /&gt;
&lt;br /&gt;
PHP verstecken: Standardmäßig fügt PHP einen Header mit der verwendeten PHP-Version in die Ausgabe mit ein. Diesen kannst du mit der Einstellung&lt;br /&gt;
 expose_php = On&lt;br /&gt;
in der PHP.INI deaktivieren.&lt;br /&gt;
Beide Maßnahmen sind allerdings nur als kleine zusätzliche Vorkehrungen zu verstehen und bieten nicht all zu viel Sicherheit. Vor allem endet ihre Wirksamkeit dort, wo GET-Parameter in der URL auftauchen, ganz offensichtlich dynamische Inhalte vorliegen oder PHP-Fehlermeldungen angzeigt werden.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Einstellungen der PHP.INI===&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei von PHP, der PHP.INI findest du einige Einstellungen, die wesentlich zur Sicherheit beitragen können:&lt;br /&gt;
 register_globals = Off &lt;br /&gt;
Wie oben schon mehrmals gezeigt: Diese Einstellung sollte unbedingt so und nicht anders konfiguriert sein. &lt;br /&gt;
&lt;br /&gt;
 display_errors = Off &lt;br /&gt;
Verhindert dass Fehlermeldungen am Bildschirm zusammen mit der Ausgabe des Skriptes angezeigt werden. Diese könnten Pfade, Datenbank(zugangs)daten und ähnliches beinhalten, was für einen Hack nützlich sein könnte. Selbstverständlich sollte diese Einstellung auf deinem Entwicklungssystem nicht gesetzt sein. &lt;br /&gt;
&lt;br /&gt;
 error_reporting = E_ALL &lt;br /&gt;
auf dem Entwicklungssystem zeigt dir beim Schreiben eines Skriptes auf, wo du evtl. uninitialisierte Variablen benutzt. Weiter oben wird beschrieben, wie diese sich für einen Hack ausnutzen lassen. &lt;br /&gt;
&lt;br /&gt;
===Meldung erstatten!===&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle wirds dann schon leicht paranoid. Hast du mit Angriffen zu rechnen, lasse dir fehlgeschlagene MySQL-Queries, Parameter die durch die Eingangsprüfung am Anfang des Skriptes durchgefallen sind und fehlgeschlagene Logins direkt per E-Mail zusammen mit allen Daten, die du vom Verursache zusammenkratzen kannst (IP-Adresse, Browser etc.pp.) zusenden. &lt;br /&gt;
&lt;br /&gt;
Klingt gut, hat aber zwei Design-Schwächen: Erstens kann ein Angreifer seine Identität locker verstecken. Zweitens könnte er genau diese Form von &amp;quot;Error Reporting&amp;quot; für einen Denial-of-Service Angriff nutzen indem er dein Postfach mit Mails zumüllt und deinen Server durch das massenhafte Versenden von Mails lahmlegt. &lt;br /&gt;
&lt;br /&gt;
Wenn man auf das Live-Feeling verzichten kann, ist es daher besser, solche Benachrichtigungen in einem Logfile abzuspeichern. &lt;br /&gt;
&lt;br /&gt;
Bitte beachte, dass ich aus Zeitgründen keine Fragen zu Web-Sicherheit in den Kommentaren beantworten kann.&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP&amp;diff=20336</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP&amp;diff=20336"/>
		<updated>2014-07-23T10:58:51Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[PHP - Snippets]]&lt;br /&gt;
&lt;br /&gt;
[[PHP - Tipps und Tricks]]&lt;br /&gt;
&lt;br /&gt;
[[PHP - Probleme lösen]]&lt;br /&gt;
&lt;br /&gt;
[[PHP - IDE Entwicklungsumgebung]]&lt;br /&gt;
&lt;br /&gt;
[[PHP - Gültigkeit von Variablen (Scope)]]&lt;br /&gt;
&lt;br /&gt;
[[PHP - Sicherheit]]&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Regul%C3%A4re_Ausdr%C3%BCcke_(RegEx)&amp;diff=20335</id>
		<title>Reguläre Ausdrücke (RegEx)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Regul%C3%A4re_Ausdr%C3%BCcke_(RegEx)&amp;diff=20335"/>
		<updated>2014-07-23T07:49:24Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Tutorial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
http://www.regular-expressions.info/reference.html&lt;br /&gt;
&lt;br /&gt;
http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke&lt;br /&gt;
&lt;br /&gt;
http://weppz.com/tipps/preg_replace-utf-8-und-umlaute/&lt;br /&gt;
&lt;br /&gt;
http://www.hongkiat.com/blog/regular-expression-tools-resources/&lt;br /&gt;
&lt;br /&gt;
=== RegEx in Apache Mod Rewrite Engine ===&lt;br /&gt;
[[Apache Mod Rewrite Syntax]]&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für Such- und Ersetzungsfunktionen mit preg_replace, preg_match etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/ oder # müssen an anfang und ende!&lt;br /&gt;
&lt;br /&gt;
. entspricht einem beliebigen Zeichen ( also Buchstaben,Zahlen,sonderzeichen,bindestriche,usw.).&lt;br /&gt;
+ entspricht anzahl &amp;gt;= 1&lt;br /&gt;
.+ entspricht mehreren beliebigen Zeichen&lt;br /&gt;
* entspricht anzahl &amp;gt;= 0&lt;br /&gt;
.* entspricht kein oder mehrere beliebigen Zeichen&lt;br /&gt;
? entspricht einem Zeichen&lt;br /&gt;
.? entspricht kein oder ein beliebiges Zeichen&lt;br /&gt;
| entspricht der OR bzw. ODER Verknüpfung&lt;br /&gt;
^ entspricht zweierlei: einmal der NOT bzw. NICHT Verknüpfung(aber nur in der [] klammer) und anderesmal, dass das folgende zeichen am anfang stehen muss.&lt;br /&gt;
&lt;br /&gt;
alle oben genannten zeichen müssen als echte zeichen mit dem \ maskiert werden, also z.B. \. entspricht dann dem .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\w entspricht einem Buchstabe&lt;br /&gt;
\w+ entsprcht mehreren (oder einem) Buchstaben&lt;br /&gt;
\d entspricht einer Zahl&lt;br /&gt;
\d+ entspricht mehreren (oder einer) Zahlen&lt;br /&gt;
&lt;br /&gt;
() entspricht einer Gruppe, wird also gespeichert. Die Erste Gruppe kann nachher bei preg_replace im replacement als $1 angegeben werden, die zweite als $2 usw.&lt;br /&gt;
(\w+) entspricht mehreren gespeicherten Buchstaben&lt;br /&gt;
[] entspricht einem Bereich&lt;br /&gt;
[a-z] entspricht den kleinen Buchstaben a bis z&lt;br /&gt;
[A-Z] entspricht den grossen Buchstaben A bis Z&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Umlaute und Sonderzeichen ===&lt;br /&gt;
Quelle s.o. bei Links&lt;br /&gt;
&lt;br /&gt;
Angenommen es sollen alle &amp;#039;&amp;#039;&amp;#039;Sonderzeichen&amp;#039;&amp;#039;&amp;#039; aus dem Satz “Grüß mich, sonst gibt’s Ärger!” entfernt und durch Leerzeichen ersetzt werden. &lt;br /&gt;
&lt;br /&gt;
 preg_replace(&amp;#039;/\W/&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
* Innerhalb / / steht der reguläre Ausdruck nach dem Gesucht wird.&lt;br /&gt;
* \W steht für &amp;quot;nicht Buchstabe&amp;quot; (also alles andere soll ersetzt werden)&lt;br /&gt;
&lt;br /&gt;
Probleme gibt es bei utf-8 als Zeichensatz. Deshalb:&lt;br /&gt;
&lt;br /&gt;
 preg_replace(&amp;#039;/\W/u&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
* Der /u Modifier sagt, daß jetzt &amp;#039;&amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;#039; kommt.&lt;br /&gt;
&lt;br /&gt;
Das funktioniert in Windows nicht aber in Linux. Dort zählen die &amp;#039;&amp;#039;&amp;#039;Umlaute&amp;#039;&amp;#039;&amp;#039; nicht zu den Buchstaben (\W) und werden entfernt. Das behebt der Modifier \pL&lt;br /&gt;
&lt;br /&gt;
* \pL steht für Zeichen jeder Sprache. Das \W wird ersetzt durch: &lt;br /&gt;
*  [ ] -&amp;gt; In den Brakets steht eine Charakterklasse &lt;br /&gt;
*  ^ -&amp;gt; steht für nicht&lt;br /&gt;
&lt;br /&gt;
 [^\pL] -&amp;gt; Suche alles was kein (^) Buchstaben jeglicher Sprache (\pL) ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ergebnis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 echo preg_replace(&amp;#039;/\[^\pL]/u&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
=== Suche nicht innerhalb html Tags ===&lt;br /&gt;
&lt;br /&gt;
Erklärung: /e interpretiert den String als php Code /i ignoriert Groß- und Kleinschreibung&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// $s in $t durch $r ersetzen:&lt;br /&gt;
preg_replace(&amp;quot;/((&amp;lt;[^&amp;gt;]*)|$s)/e&amp;quot;, &amp;#039;&amp;quot;\2&amp;quot;==&amp;quot;\1&amp;quot;? &amp;quot;\1&amp;quot;:&amp;quot;$r&amp;quot;&amp;#039;, $t);&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// $s case-insensitive in $t hervorheben:&lt;br /&gt;
preg_replace(&amp;quot;/((&amp;lt;[^&amp;gt;]*)|$s)/ie&amp;quot;, &amp;#039;&amp;quot;\2&amp;quot;==&amp;quot;\1&amp;quot;? &amp;quot;\1&amp;quot;:&amp;quot;&amp;lt;b&amp;gt;\1&amp;lt;/b&amp;gt;&amp;quot;&amp;#039;, $t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
von http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke&lt;br /&gt;
&lt;br /&gt;
Fangen wir mal klein an. Wir wollen prüfen, ob eine Eingabe einer &amp;#039;&amp;#039;&amp;#039;Schulnote von 1-6&amp;#039;&amp;#039;&amp;#039; entspricht.&lt;br /&gt;
 [123456]&lt;br /&gt;
erledigt das für uns. Du siehst: in eckigen Klammern folgt eine Auflistung von Zeichen, die erlaubt sind. Insgesamt steht der gesamte geklammerte Ausdruck aber nur für ein Zeichen: 1 oder 2 oder ... oder 6. &lt;br /&gt;
&lt;br /&gt;
Da unsere Zahlen von 1 bis 6 so schön aufeinanderfolgen, können wir auch schreiben&lt;br /&gt;
 [1-6]&lt;br /&gt;
was die Sache etwas übersichtlicher macht. Genau so könnte man z.b. prüfen, ob eine Eingabe einem Gleis auf einem Bahnhof entspricht:&lt;br /&gt;
 [1-9]&lt;br /&gt;
für einen Bahnhof mit 9 Gleisen. Auf unserem Bahnhof sei heute Gleis 4 gesperrt, also als Eingabe nicht erlaubt:&lt;br /&gt;
 [1-35-9]&lt;br /&gt;
Wir haben den Eingabebereich also aufgeteilt in &amp;#039;&amp;#039;&amp;#039;zwei Bereiche&amp;#039;&amp;#039;&amp;#039; 1-3 und 5-9. Du siehst: Die beiden Bereiche werden einfach hintereinander geschrieben. Das ist am Anfang gewöhnungsbedürftig (intuitiv möchte man vielleicht ein Leerzeichen machen), aber das wird uns noch öfter begegnen.&lt;br /&gt;
Mehrelementige reguläre Ausdrücke&lt;br /&gt;
&lt;br /&gt;
Was ist, wenn auf unserem Bahnhof jetzt angebaut wird? Sagen wir, er wird auf 12 Gleise erweitert:&lt;br /&gt;
 [1-12]&lt;br /&gt;
(Gleis 4 sei wieder geöffnet ;-) ). Aber Vorsicht, hier ist ein Fehler drin! &lt;br /&gt;
&lt;br /&gt;
Wie oben erwähnt, steht der gesamte Ausdruck in den eckigen Klammern nur für ein Zeichen. &amp;quot;12&amp;quot; enthält aber zwei Zeichen. Der Code oben wird nicht funktionieren: Er bedeutet &amp;quot;1 bis 1&amp;quot; oder &amp;quot;2&amp;quot;. Den Umgang mit Bahnhöfen mit mehr als 9 Gleisen demonstrieren wir später. &lt;br /&gt;
&lt;br /&gt;
Für den Moment wollen wir etwas anderes Prüfen: Bahnsteige 1-9 haben noch jeweils Abschnitt &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot;. Wir wollen also auf 1a,1b,2a,...,9a,9b prüfen:&lt;br /&gt;
 [1-9][ab]&lt;br /&gt;
Will heißen: &amp;#039;&amp;#039;&amp;#039;Eine Zahl 1-9 gefolgt von einem Buchstaben a oder b&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mehrere rechteckige Klammern entsprechen also mehreren Zeichen&amp;#039;&amp;#039;&amp;#039;. Soll ein Ausdruck mehrere Zeichen beschreiben, werden diese einfach hintereinander gehangen. Dann wird die Eingabe von links nach rechts mit deinem Ausdruck verglichen. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich müssen auch nicht immer alle Buchstaben aufgeführt werden:&lt;br /&gt;
 [1-9][a-d]&lt;br /&gt;
trifft jetzt auch z.B. 4d. &lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass Groß- und Kleinschreibung getrennt behandelt wird. Eine sinnvolle Erweiterung wäre also z.B.&lt;br /&gt;
 [1-9][a-dA-D]&lt;br /&gt;
&lt;br /&gt;
===Optionen===&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die Eingabe einer &amp;#039;&amp;#039;&amp;#039;Hausnummer&amp;#039;&amp;#039;&amp;#039; an. Diese können aus einer oder mehreren (bis zu 3) Ziffern bestehen und ein a-z am Ende haben. Müssen aber nicht.&lt;br /&gt;
 [1-9][0-9]?[0-9]?[a-z]?&lt;br /&gt;
Das Fragezeichen hinter einem Element (und [1-9] ist ein Element!) besagt: &amp;#039;&amp;#039;&amp;#039;Das vorhergehende Element kann vorkommen, muss aber nicht&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Der letzte Code heißt also: Eine Ziffer (1-9), optional zwei weitere Ziffern (0-9), optional ein Buchstabe. &lt;br /&gt;
&lt;br /&gt;
Stellt man sich solch eine Konstruktion mit z.B. 10 Ziffern vor, kann man sich leicht ausmalen, dass sie schnell sehr lang wird. Daher gibt es eine andere Schreibweise, wenn man &amp;#039;&amp;#039;&amp;#039;ein Element mehr als ein mal erlauben&amp;#039;&amp;#039;&amp;#039; will:&lt;br /&gt;
 a{1,3}h&lt;br /&gt;
Trifft auf &amp;quot;ah&amp;quot; genau so wie auf &amp;quot;aaah&amp;quot;. Die Angabe in Klammern steht also für die &amp;#039;&amp;#039;&amp;#039;{minimale, maximale} Anzahl an Zeichen&amp;#039;&amp;#039;&amp;#039;. Daher können wir unsere Hausnummern auch so formulieren:&lt;br /&gt;
 [1-9][0-9]{0,2}[a-z]?&lt;br /&gt;
und dann auch ohne Probleme für längere Straßen (USA ;-) ) umschreiben:&lt;br /&gt;
 [1-9][0-9]{1,4}[a-z]?&lt;br /&gt;
erlaubt jetzt auch Hausnummern im fünfstelligen Bereich, fordert aber mindestens eine zweistellige (beachte die Änderung vor dem Komma). &lt;br /&gt;
&lt;br /&gt;
Eine Konstruktion wie&lt;br /&gt;
 [0-9]{5}&lt;br /&gt;
(also eine Klammer mit nur einer Angabe) verlangt eine genau &amp;#039;&amp;#039;&amp;#039;x-malige Wiederholung des davorstehenden Ausdrucks&amp;#039;&amp;#039;&amp;#039;. In unserem Fall 5 mal: Dieser reguläre Ausdruck wäre geeignet, um (deutsche) Postleitzahlen zu prüfen. &lt;br /&gt;
&lt;br /&gt;
Wir könne auch ein &amp;#039;&amp;#039;&amp;#039;&amp;quot;mindestens&amp;quot;&amp;#039;&amp;#039;&amp;#039; ausdrücken:&lt;br /&gt;
 [0-9]{3,}&lt;br /&gt;
fordert eine mindestens 3-malige Wiederholung einer Ziffer.&lt;br /&gt;
&lt;br /&gt;
===Beliebige Wiederholungen===&lt;br /&gt;
&lt;br /&gt;
Bisher mussten wir immer wissen, wieviele Zeichen gefunden werden sollen. Es gibt aber durchaus Fälle, in denen sich ein Zeichen beliebig oft wiederholen darf. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die Prüfung von Telefonnummern an. Wenn man einen regulären Ausdruck schreibt, empfiehlt es sich oft, zunächst einmal zu notieren, auf was dieser alles treffen soll. Unsere Telefonnummern sollen von diesem Format sein dürfen:&lt;br /&gt;
 0651/55541-36&lt;br /&gt;
 0049 160 555678&lt;br /&gt;
 0180.23.555.63&lt;br /&gt;
Es können neben Zahlen also auch Bindestriche, Querstriche, Leerzeichen und Punkte vorkommen. Ein gültiges Element wäre also&lt;br /&gt;
 [0-9/. -]&lt;br /&gt;
(Also: Dieses eine Zeichen besteht aus einer Zahl zwischen 0 und 9 oder einem Slash oder einem Punkt oder einem Leerzeichen oder einem Minus.) Doch Vorsicht! Wie du siehst, kommen in den Klammern zwei Bindestriche vor: ein mal in einer speziellen Funktion, um einen Zahlenbereich anzudeuten und ein mal als &amp;quot;echter&amp;quot; Bindestrich, der so auftauchen darf. Um Verwechslungen auszuschließen müssen wir letzteren &amp;#039;&amp;#039;&amp;#039;maskieren&amp;#039;&amp;#039;&amp;#039;, also zeigen dass er hier keine spezielle Funktion hat. Das geht mit einem vorangestellten Backslash:&lt;br /&gt;
 [0-9/. \-]&lt;br /&gt;
Und dann wollen wir ja noch mitteilen, dass diese Zeichen &amp;#039;&amp;#039;&amp;#039;beliebig oft&amp;#039;&amp;#039;&amp;#039; vorkommen dürfen:&lt;br /&gt;
 [0-9/. \-]+&lt;br /&gt;
Das Plus bedeutet: ein oder mehrmals das davor befindliche Zeichen, also &amp;#039;&amp;#039;&amp;#039;mindestens ein mal&amp;#039;&amp;#039;&amp;#039;. Wollen wir auch eine leere Telefonnummer zulassen (der Mathematiker würde sagen: Die &amp;#039;&amp;#039;&amp;#039;Nullnummer&amp;#039;&amp;#039;&amp;#039;), so gibt es dazu ein anderes Zeichen:&lt;br /&gt;
 [0-9/. \-]*&lt;br /&gt;
trifft jetzt auch auf &amp;quot;&amp;quot; (&amp;#039;&amp;#039;&amp;#039;leere Zeichenkette&amp;#039;&amp;#039;&amp;#039;) und natürlich unsere Telefonnummern. &lt;br /&gt;
&lt;br /&gt;
Also nochmal zusammengefasst:&amp;#039;&amp;#039;&amp;#039; Das + steht für eine mindestens einmalige Wiederholung. * heißt: keinmal oder beliebig oft&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
===Platzhalter===&lt;br /&gt;
&lt;br /&gt;
Gehen wir zu einem anderen Beispiel über: Wir möchten in einer Bibliothek nach einem Autor suchen, wissen aber nicht, ob er evtl. einen zweiten Vornamen hat. Nach dem Vornamen können also beliebige Zeichen kommen und danach dann erst der Nachname. Eine mögliche Lösung sieht so aus:&lt;br /&gt;
 Marius .*Osterhase&lt;br /&gt;
Die im Einzelnen bedeutet: &amp;quot;Marius&amp;quot;, danach ein Leerzeichen gefolgt von einem beliebigen Zeichen (dafür steht der Punkt!) beliebig oft (also evtl. auch gar keins) und anschließend der Nachname. Das trifft auf &amp;quot;Marius Osterhase&amp;quot; genau so wie auf &amp;quot;Marius Müller Osterhase&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Genau so kann man dem Punkt natürlich auch ein Plus folgen lassen, um mindestens ein beliebiges Zeichen zu fordern. &lt;br /&gt;
&lt;br /&gt;
Der Punkt &amp;quot;frisst&amp;quot; normalerweise zwar fast alles, aber keine Zeilenumbrüche. Wie du ihn dazu bringst, findest du unter Modifikatoren. &lt;br /&gt;
&lt;br /&gt;
Dem &amp;quot;aufmerksamen Leser&amp;quot; wird nicht entgangen sein, dass wir oben auch schon einen Punkt hatten, und zwar innerhalb der eckigen Klammern. Wie bei vielen, aber nicht allen Sonderzeichen müssen diese zwar außerhalb von eckigen Klammern als solche maskiert werden (Backslash davor), aber nicht innerhalb.&lt;br /&gt;
Zeichenklassen negieren&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wüssten den zweiten Vornamen des Autors nicht genau, aber können uns daran erinnern, dass er kein q und kein z enthält. Auch kein Problem:&lt;br /&gt;
 Marius [^qz]+ Osterhase&lt;br /&gt;
verlangt nach einem zweiten Vornamen (deswegen das Plus) und lässt dazu ein beliebiges Zeichen zu, das nicht q oder z ist. Das ^ negiert also eine Zeichenklasse und gilt genau bis zur schließenden Klammer.&lt;br /&gt;
&lt;br /&gt;
===Klammern===&lt;br /&gt;
&lt;br /&gt;
Klammern können dazu benutzt werden, längere Ausdrücke zu einem Element zusammenzufassen und es damit zu ermöglichen, das oben gelernte auch auf Teilausdrücke anzuwenden:&lt;br /&gt;
 Marius (Müller )?Osterhase&lt;br /&gt;
trifft genau auf &amp;quot;Marius Müller Osterhase&amp;quot; oder &amp;quot;Marius Osterhase&amp;quot; und auf nichts anderes: Das Fragezeichen bezieht sich - dank der Klammern - auf den kompletten zweiten Vornamen und das folgende Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Ebenso lässt sich schreiben:&lt;br /&gt;
 Ba(na)*ne&lt;br /&gt;
Was jetzt sowohl für dieses gelbe Ding als auch z.B. für &amp;quot;Banananane&amp;quot; steht. Auch hier lässt sich die Notation mit den geschweiften Klammern anwenden:&lt;br /&gt;
 Ba(na){2,5}ne&lt;br /&gt;
was jetzt natürlich eine entsprechend andere Bedeutung hat.&lt;br /&gt;
&lt;br /&gt;
===Alternativen===&lt;br /&gt;
&lt;br /&gt;
Mit Klammern kann man aber auch noch andere Sachen machen, z.B. Alternativen zu einem Teilausdruck angeben:&lt;br /&gt;
 Das Wetter ist (toll|richtig schlecht)&lt;br /&gt;
In diesem Beispiel dürfen als letzte Worte &amp;quot;toll&amp;quot; oder &amp;quot;richtig schlecht&amp;quot; vorkommen, aber nicht beide.&lt;br /&gt;
&lt;br /&gt;
===Modifikatoren===&lt;br /&gt;
&lt;br /&gt;
In allen RegEx-Varianten kannst du sogenannte Modifikatoren setzen und damit das genaue Verhalten des Ausdrucks kontrollieren. In Java kannst du dies z.B. bei der Konstruktion eines matcher-Objektes erledigen, bei PHP hat ein regulärer Ausdruck immer die Syntax&lt;br /&gt;
 [Begrenzungszeichen][RegEx][Begrenzungszeichen][Modifikator(en)]&lt;br /&gt;
also z.B.&lt;br /&gt;
 /(Mein|Ausdruck)/im&lt;br /&gt;
Dabei sind &amp;quot;i&amp;quot; und &amp;quot;m&amp;quot; in diesem Fall Modifikatoren. Gängige Modifikatoren sind unter anderem:&lt;br /&gt;
i Case-Insensitivity (die Nichtbeachtung von Groß- und Kleinschreibung)einschalten&lt;br /&gt;
s Punkt wird multilinefähig: Der Punkt frisst auch Zeilenumbrüche, dies ist standardmäßig nicht so.&lt;br /&gt;
m Zeilenmodus: Die Zeichen ^ und $ passen mit auch auf Zeilenanfänge bzw. -enden. Ohne den Modifikator passen sie nur auf Anfang und Ende der gesamten Zeichenkette.&lt;br /&gt;
Modifikatoren beziehen sich immer auf den ganzen Ausdruck und sind daher eine leicht übersehene Fehlerquelle.&lt;br /&gt;
&lt;br /&gt;
===Kompliziertere Ausdrücke===&lt;br /&gt;
&lt;br /&gt;
====Verschachtelungen====&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich dürfen auch diverse Klammern ineinander geschachtelt werden, wie z.B. in folgendem Ausdruck:&lt;br /&gt;
 (VW (Golf|Polo)|Fiat (Punto|Panda))&lt;br /&gt;
welcher auf &amp;quot;VW Golf&amp;quot;, &amp;quot;VW Polo&amp;quot;, &amp;quot;Fiat Punto&amp;quot; und &amp;quot;Fiat Panda&amp;quot; trifft. Dies ermöglich zwar recht kurze Ausdrücke für lange Zeichenketten, kann aber auch viel Zeit zur Verarbeitung in Anspruch nehmen. &lt;br /&gt;
&lt;br /&gt;
Genau so lassen sich auch diese Alternativen wiederholen:&lt;br /&gt;
 (10|01)+&lt;br /&gt;
Beschreibt eine Folge aus Nullen und Einsen, in der maximal 2 Nullen oder Einsen aufeinander folgen. (Falls das jetzt nicht direkt klar wird: einfach mal überlegen, was man aus &amp;quot;10&amp;quot; und &amp;quot;01&amp;quot; zusammensetzen kann.)&lt;br /&gt;
&lt;br /&gt;
====Gierige Ausdrücke====&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel aus der Praxis: Der folgende, etwas längerer Code soll uns aus einer HTML-Datei die Links bzw. deren Zieladressen heraussuchen. Ein Link in einem HTML-Quellcode hat i.d.R. ein Format wie dieses:&lt;br /&gt;
 &amp;lt;a href=&amp;quot;[...Zieladresse...]&amp;quot; [...weitere Angaben...]&amp;gt;&lt;br /&gt;
z.B.&lt;br /&gt;
 &amp;lt;a href=&amp;quot;http://www.example.org/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
Ein möglicher Ausdruck dafür ist recht schnell gefunden:&lt;br /&gt;
 &amp;lt;a href=&amp;quot;.*&amp;quot;.*&amp;gt;&lt;br /&gt;
Sieht gut aus, klappt aber nicht. Warum? &lt;br /&gt;
&lt;br /&gt;
Der Autor hat sich zwar gedacht der Ausdruck würde an der zu dem Link gehörenden schließenden Klammer aufhören, er tut es aber nicht. Im folgenden ein Ausschnitt aus einer HTML-Datei mit markiertem Treffer:&lt;br /&gt;
 &amp;lt;BODY&amp;gt; Bla Blubb 1 2 3 &amp;lt;a href=&amp;quot;http://www.example.org/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; Linktext &amp;lt;/a&amp;gt; Viel, viel weiterer &amp;lt;i&amp;gt;Text&amp;lt;/i&amp;gt; Blubb 42&lt;br /&gt;
Das geht eindeutig zu weit! Der zweite Punkt ist zu &amp;quot;gierig&amp;quot; und frisst alle Zeichen sogar über mehrere schließende spitze Klammern hinweg. In anderen Situationen wäre es denkbar, dass der erste Punkt ähnlich amokläuft. &lt;br /&gt;
&lt;br /&gt;
Für unseren Fall gibt es zwei Lösungsmöglichkeiten. Oft bleibt jedoch nur eine davon, daher stelle ich beide vor:&lt;br /&gt;
Den Punkt ersetzen durch etwas was keine spitzen Klammern mehr frisst:&lt;br /&gt;
 &amp;lt;a href=&amp;quot;.*&amp;quot;[^&amp;gt;]*&amp;gt;&lt;br /&gt;
Das ist eine oft anzuwendende Methode (überlege dir, welche Zeichen das Ende markieren und schließe diese von dem zu treffenden aus). Das ganze muss jetzt natürlich noch analog für den ersten Punkt gemacht werden:&lt;br /&gt;
 &amp;lt;a href=&amp;quot;[^&amp;quot;]*&amp;quot;[^&amp;gt;]*&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Punkt &amp;quot;umerziehen&amp;quot; (bzw. * genügsam machen) so dass beide zusammen nur noch so viel fressen, wie unbedingt nötig ist. Dies tut ein angehängtes Fragezeichen, was dann natürlich nicht mehr die bisher bekannte Funktion hat:&lt;br /&gt;
 &amp;lt;a href=&amp;quot;.*?&amp;quot;.*?&amp;gt;&lt;br /&gt;
Natürlich funktioniert diese Sonderbenutzung des Fragezeichens auch hinter einem Pluszeichen. &lt;br /&gt;
&lt;br /&gt;
====Gruppen====&lt;br /&gt;
&lt;br /&gt;
So gut wie alle RegEx-Dialekte erlauben das Bilden von Gruppen und deren Speicherung für spätere Verwendung. Auch dazu können Klammern dienen. &lt;br /&gt;
&lt;br /&gt;
Spätere Verwendung kann z.B. heißen, dass ein Ausdruck zwar auf eine längere Zeichenkette treffen soll, aber nur ein Teil davon wirklich verwendet werden soll. &lt;br /&gt;
&lt;br /&gt;
Soetwas wäre in Verbindung mit dem obigen Ausdruck sehr nützlich, um alle Zieladressen aus einer HTML-Seite zu filtern. &lt;br /&gt;
&lt;br /&gt;
Wie genau du an die Inhalte der Gruppen kommst, steht in der Anleitung der von dir verwendeten Sprache. Bei PHP findest du es z.B. bei preg_match und Java soweit ich mich erinnern kann irgendwo in der Nähe von regex.matcher. Google sollte da mehr zu wissen.&lt;br /&gt;
 &amp;lt;a href=&amp;quot;(.*?)&amp;quot;.*?&amp;gt;&lt;br /&gt;
Der erste Punkt und seine &amp;quot;Vervielfacher&amp;quot; sind eingeklammert. In der ersten Gruppe befindet sich jetzt also die URL. &lt;br /&gt;
&lt;br /&gt;
Beachte, dass bei der Nummerierung der Gruppen die Reihenfolge der öffnenden Klammer zählt. Das ist wichtig zu beachten bei verschachtelten Klammern. Außerdem zählen normalerweise alle Klammern, auch wenn sie nur zur Ausweisung von Alternativen (s.o.) verwendet werden.&lt;br /&gt;
&lt;br /&gt;
====Referenzen====&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen anderen, sehr nützlichen Verwendungszweck für Gruppen. Stell dir vor, du willst in einer Folge von Zahlen (sagen wir sie seien mit einem Leerzeichen voneinander getrennt) all die Zahlen finden, die mit der selben Ziffer beginnen und enden. &lt;br /&gt;
&lt;br /&gt;
Wir haben also&lt;br /&gt;
 129 337873 78324 43938 9388 824998 349734&lt;br /&gt;
Dazu können wir solch einen Ausdruck verwenden:&lt;br /&gt;
 ([0-9])[0-9]*\1&lt;br /&gt;
wobei das \1 auf den Inhalt der ersten Klammer verweist (referenziert) und daher an der Stelle von \1 das selbe stehen muss wie in dieser Klammer. Das erste und letzte Zeichen unseres Ausdrucks ist jeweils ein Leerzeichen, um damit das Ende und den Anfang einer Zahl zu kennzeichnen. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns an, auf was er trifft:&lt;br /&gt;
 129 337873 78324 43938 9388 824998 349734&lt;br /&gt;
Wie du siehst, zählt das erste und letzte Leerzeichen auch immer noch zu dem jeweiligen Treffer dazu. Das ist auch kein Wunder, schließlich steht vor und hinter unserem Ausdruck auch jeweils ein Leerzeichen. Das ist nicht wirklich gut, wenn uns dieses Leerzeichen eigentlich gar nicht interessiert. Daher stellt die RegEx-Sprache auch hier ein Mittel zur Verfügung, welches auch funktioniert, wenn wir keine Gruppen benutzen möchten oder können:&lt;br /&gt;
&lt;br /&gt;
===Spezielle Zeichen: Wortgrenzen===&lt;br /&gt;
&lt;br /&gt;
Es gibt Zeichen, die stehen zwar im regulären Ausdruck, aber nicht in dem Text, der nachher gematcht wird. Das sagt dir jetzt nichts? Naja, schauen wir uns als ein Beispiel an, wie man obigen Ausdruck ohne die Leerzeichen schreibt:&lt;br /&gt;
 \b([0-9])[0-9]*\1\b&lt;br /&gt;
Dieses &amp;quot;\b&amp;quot; ist ein zusammengehöriges Element und kennzeichnet ein Wortanfang oder ein Wortende (also eine Wortgrenze). Kennst du die in Textverarbeitungsprogrammen und Editoren oft verwendete Möglichkeit &amp;quot;Nur ganzes Wort suchen&amp;quot; in der Suchfunktion? Wählst du diese aus, werden z.B. bei einer Suche nach &amp;quot;Kai&amp;quot; statt diesen Treffern&lt;br /&gt;
 Kai fährt nach &lt;br /&gt;
 Kaiserslautern&lt;br /&gt;
nur noch dieser Treffer gefunden:&lt;br /&gt;
 Kai fährt nach &lt;br /&gt;
 Kaiserslautern&lt;br /&gt;
Letzteres ließe sich in regulären Ausdrücken so umsetzen bzw. ausdrücken:&lt;br /&gt;
 \bKai\b&lt;br /&gt;
Also &amp;quot;Kai&amp;quot; nur, wenn es von Wortgrenzen umgeben ist. Was genau ist überhaupt eine Wortgrenze? Eine Wortgrenze tritt zwischen einem Wort-Zeichen und einem Nichtwortzeichen auf. Hä? (Erklärung folgt!)&lt;br /&gt;
&lt;br /&gt;
===Spezielle Zeichen: Weitere Zeichen===&lt;br /&gt;
&lt;br /&gt;
Es gibt - Überraschung! - noch mehr Sonderzeichen, die du verwenden kannst und die eine RegEx schön abkürzen können. Diese bestehen immer aus einem Backslash gefolgt von einem weiteren Zeichen (Buchstaben). Übrigens steht ein großer Buchstabe dabei immer für das Gegenteil eines kleinen.&lt;br /&gt;
 \w  \W&lt;br /&gt;
Ein Wort-Zeichen (kleines w) steht genau für [a-zA-Z0-9] und ein Nichtwortzeichen (großes W) steht genau für alles andere, also [^a-zA-Z0-9].&lt;br /&gt;
 \d  \D&lt;br /&gt;
Ein Digit, also eine Ziffer von 0-9. Entspricht damit [0-9] und in der Großschreibung [^0-9].&lt;br /&gt;
 \b  \B&lt;br /&gt;
Die &amp;quot;kleine&amp;quot; Variante hast du ja oben schon kennengelernt. Ein großes B steht dementsprechend für alle Stellen, an denen keine Wortgrenze auftritt.&lt;br /&gt;
 \s  \S&lt;br /&gt;
Die Kleine Variante steht für alle Whitespaces: Das sind so gut wie alle Zeichen, die man nicht sieht. Also Return (bzw. Enter), Leertaste (Space), Tab(ulator).&lt;br /&gt;
 \\&lt;br /&gt;
Wenn man mit Backslash, wie du gesehen hast, Sonderzeichen anfängt, muss man ja auch den Backslash selbst irgendwie fabrizieren können, wenn man genau diesen meint. Dies macht man einfach durch einen doppelten solchen. Man sagt: der erste &amp;quot;maskiert&amp;quot; den zweiten.&lt;br /&gt;
 \.  \+  \*  \(  \)  \[  \]  \-  \$  \|&lt;br /&gt;
Der Punkt und viele andere Zeichen haben, wie du oben gesehen hast, eine Sonderfunktion. Daher werden sie mittels eines Backslashs von dieser Sonderfunktion abgehalten (&amp;quot;maskiert&amp;quot;). Dies gilt für das Minuszeichen nur innerhalb von Zeichenklassen, dafür darfst du in selbigen bei vielen anderen Zeichen die Backslashs weglassen.&lt;br /&gt;
&lt;br /&gt;
===Anfangs- und Endezeichen===&lt;br /&gt;
&lt;br /&gt;
Stell dir vor, du willst ein Datum prüfen, sagen wir mit&lt;br /&gt;
 1\.3\.2004&lt;br /&gt;
Und diesen Ausdruck lässt du auf&lt;br /&gt;
 11.3.2004&lt;br /&gt;
los. Was kommt raus? Dein Ausdruck wird dir melden, dass er trifft. Ist ja auch irgendwo klar, schließlich steht, wenn man eine Eins weglässt, dein Datum da. Du willst aber, dass das gesamte Datum wie deins aussieht? Gibt\&amp;#039;s da nicht was von Ratiodingsbums? Doch gibts:&lt;br /&gt;
 ^1\.3\.2004$&lt;br /&gt;
Dieses Dach am Anfang sagt: Treffe nur, wenn hier der zu durchsuchende String anfängt. Und das Dollarzeichen steht für: Treffe nur, wenn genau hier der zu durchsuchende String endet. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man beide auch einzeln einsetzen; Als Beispiel schauen wir uns zwei reguläre Ausdrücke an: Der erste trifft auf einen String, der mit einer Zahl endet. Der zweite trifft auf einen String, der mit einer öffnenden Klammer beginnt. Dabei benutzen wir die oben angegebene Maskierung für die Klammer.&lt;br /&gt;
 \d$ &lt;br /&gt;
 ^\(&lt;br /&gt;
&lt;br /&gt;
===Positive Lookaheads und Lookbehinds===&lt;br /&gt;
&lt;br /&gt;
Du hast jetzt Möglichkeiten kennengelernt, wie du Wortgrenzen feststellen kannst, ohne sie selbst wirklich mitzufressen. Es gibt auch eine universelle Möglichkeit. &lt;br /&gt;
&lt;br /&gt;
Als Beispiel soll folgende Zahlenfolge dienen:&lt;br /&gt;
 000566403580000345050052301078906040092800100001007680&lt;br /&gt;
Aus dieser Zahlenfolge sollen alle jene Folgen heraufgefischt werden, die drei Ziffern ungleich Null enthalten und von einer Null an jeder Seite begrenzt werden. In unserem Fall also &amp;quot;358&amp;quot;, &amp;quot;345&amp;quot;, &amp;quot;523&amp;quot;, &amp;quot;789&amp;quot;, &amp;quot;928&amp;quot; und &amp;quot;768&amp;quot;. Dazu kannst du folgenden Code benutzen:&lt;br /&gt;
 (?&amp;lt;=0)\d{3}(?=0)&lt;br /&gt;
Keine Panik! Zur Erklärung, und wir fangen in der Mitte an: das \d{3} sollte klar sein (3 Ziffern). Davor findest du die Klammer (?&amp;lt;=0). Die Zeichen ?&amp;lt;= musst du &amp;quot;en bloc&amp;quot; betrachten und sie kennzeichnen eine Sonderfunktion für die Klammer. Diese steht damit für &amp;quot;vornedran eine Null&amp;quot;. Und weil &amp;quot;vornedran&amp;quot; in der normalen Leserichtung der westlichen Welt bedeutet, dass die Klammer &amp;quot;rückwärts&amp;quot; schaut, heißt diese Funktion &amp;quot;positive lookbehind&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Genauso mit den Zeichen &amp;quot;?=&amp;quot;, diese weisen der Klammer die Sonderfunktion &amp;quot;hintendran muss ... kommen&amp;quot; zu, in unserem Fall also &amp;quot;hintendran eine Null&amp;quot;. Das ganze nennt sich &amp;quot;positive lookahead&amp;quot;, weil die Klammer &amp;quot;nach vorne&amp;quot; schaut. &lt;br /&gt;
&lt;br /&gt;
Unser &amp;quot;\b&amp;quot;-Beispiel von oben könnten wir also auch folgendermaßen ausdrücken, wenn wir unser Wissen über &amp;quot;\W&amp;quot; benutzen:&lt;br /&gt;
 (?&amp;lt;=\W)(\d)\d*\1(?=\W)&lt;br /&gt;
Zur Erklärung fangen wir wieder in der Mitte an: Da steht der von oben bekannte Code (Eine Ziffer, beliebig viele weitere Ziffern und eine weitere Ziffer, die die gleiche wie die erste ist). Die allererste Klammer fordert vor der ersten Ziffer ein Nichtwortzeichen und die allerletzte Klammer ein Nichtwortzeichen hinter der letzten Ziffer. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können lookaheads und lookbehinds auch einzeln in einem regulären Ausdruck vorkommen und sogar mehrfach. Das einzige, was nicht geht, ist ein lookbehind mit einer unbekannten Anzahl von Zeichen. (also so Dingern wie *, + und {0,4}) &lt;br /&gt;
&lt;br /&gt;
Alles klar? Wenn nicht, dann zurück zum Anfang dieses Abschnitts, gehe nicht über &amp;quot;Los&amp;quot; und ziehe keine 200 RegExen ein.&lt;br /&gt;
Negative Lookaheads und Lookbehinds&lt;br /&gt;
&lt;br /&gt;
Du hast das kompliziert gefunden und siehst so langsam ein, wie voodoo reguläre Ausdrücke sind? Es kommt noch besser. &lt;br /&gt;
&lt;br /&gt;
Dazu noch ein Beispiel: Du willst eine E-Mail-Adresse prüfen, die aber nicht aus Frankreich stammen soll. Zunächst schauen wir uns eine einfache E-Mail-Adressen-Prüfung ohne die Einschränkung an:&lt;br /&gt;
 [^@]+@.+\.[^.]+&lt;br /&gt;
(Ein Zeichen ungleich dem @-Zeichen, gefolgt von einem @-Zeichen, beliebigen Zeichen (aber mindestens eins), einem Punkt und dahinter beliebige Zeichen, aber kein Punkt mehr. Trifft auf toll@example.com genau so wie auf viele_.Zeichen@noch.mehr.Punkte.example.com.) Wichtig: das letzte Paar von eckigen Klammern frisst immer den letzten Teil (die Top-Level-Domain, im Beispiel &amp;quot;com&amp;quot;) der E-Mail-Adresse. &lt;br /&gt;
&lt;br /&gt;
Jetzt fügen wir eine Beschränkung ein und wollen &amp;quot;fr&amp;quot; an dieser Stelle ausschließen. Auf den Punkt darf also nicht &amp;quot;fr&amp;quot; folgen.&lt;br /&gt;
 [^@]+@.+\.(?!fr)[^.]+&lt;br /&gt;
erledigt das für uns. ?! kennzeichnet eine Klammer also als &amp;quot;hier darf nicht folgen&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Damit könnte man auch eine besondere Suche nach einem Wort gestalten.&lt;br /&gt;
 \bF(?!eta\b).*\b&lt;br /&gt;
trifft auf alle Wörter, die mit &amp;quot;F&amp;quot; anfangen, aber ungleich &amp;quot;Feta&amp;quot; sind. Im folgenden Text sind alle Strings markiert, die getroffen werden:&lt;br /&gt;
Fett Feta Falsch Feucht Fuffziger&lt;br /&gt;
Das war der &amp;quot;negative lookahead&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Und weils so schön war, leg ich noch einen drauf, den &amp;quot;&amp;#039;&amp;#039;&amp;#039;negative lookbehind&amp;#039;&amp;#039;&amp;#039;&amp;quot;:&lt;br /&gt;
 .*(?&amp;lt;!Müll)eimer&lt;br /&gt;
trifft auf alle Eimer, in die kein Müll gehört, meint also: &amp;quot;treffe an dieser Stelle, wenn davor kein &amp;quot;Müll&amp;quot; steht&amp;quot;.&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Regul%C3%A4re_Ausdr%C3%BCcke_(RegEx)&amp;diff=20334</id>
		<title>Reguläre Ausdrücke (RegEx)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Regul%C3%A4re_Ausdr%C3%BCcke_(RegEx)&amp;diff=20334"/>
		<updated>2014-07-23T07:34:07Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
http://www.regular-expressions.info/reference.html&lt;br /&gt;
&lt;br /&gt;
http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke&lt;br /&gt;
&lt;br /&gt;
http://weppz.com/tipps/preg_replace-utf-8-und-umlaute/&lt;br /&gt;
&lt;br /&gt;
http://www.hongkiat.com/blog/regular-expression-tools-resources/&lt;br /&gt;
&lt;br /&gt;
=== RegEx in Apache Mod Rewrite Engine ===&lt;br /&gt;
[[Apache Mod Rewrite Syntax]]&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für Such- und Ersetzungsfunktionen mit preg_replace, preg_match etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/ oder # müssen an anfang und ende!&lt;br /&gt;
&lt;br /&gt;
. entspricht einem beliebigen Zeichen ( also Buchstaben,Zahlen,sonderzeichen,bindestriche,usw.).&lt;br /&gt;
+ entspricht anzahl &amp;gt;= 1&lt;br /&gt;
.+ entspricht mehreren beliebigen Zeichen&lt;br /&gt;
* entspricht anzahl &amp;gt;= 0&lt;br /&gt;
.* entspricht kein oder mehrere beliebigen Zeichen&lt;br /&gt;
? entspricht einem Zeichen&lt;br /&gt;
.? entspricht kein oder ein beliebiges Zeichen&lt;br /&gt;
| entspricht der OR bzw. ODER Verknüpfung&lt;br /&gt;
^ entspricht zweierlei: einmal der NOT bzw. NICHT Verknüpfung(aber nur in der [] klammer) und anderesmal, dass das folgende zeichen am anfang stehen muss.&lt;br /&gt;
&lt;br /&gt;
alle oben genannten zeichen müssen als echte zeichen mit dem \ maskiert werden, also z.B. \. entspricht dann dem .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\w entspricht einem Buchstabe&lt;br /&gt;
\w+ entsprcht mehreren (oder einem) Buchstaben&lt;br /&gt;
\d entspricht einer Zahl&lt;br /&gt;
\d+ entspricht mehreren (oder einer) Zahlen&lt;br /&gt;
&lt;br /&gt;
() entspricht einer Gruppe, wird also gespeichert. Die Erste Gruppe kann nachher bei preg_replace im replacement als $1 angegeben werden, die zweite als $2 usw.&lt;br /&gt;
(\w+) entspricht mehreren gespeicherten Buchstaben&lt;br /&gt;
[] entspricht einem Bereich&lt;br /&gt;
[a-z] entspricht den kleinen Buchstaben a bis z&lt;br /&gt;
[A-Z] entspricht den grossen Buchstaben A bis Z&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Umlaute und Sonderzeichen ===&lt;br /&gt;
Quelle s.o. bei Links&lt;br /&gt;
&lt;br /&gt;
Angenommen es sollen alle &amp;#039;&amp;#039;&amp;#039;Sonderzeichen&amp;#039;&amp;#039;&amp;#039; aus dem Satz “Grüß mich, sonst gibt’s Ärger!” entfernt und durch Leerzeichen ersetzt werden. &lt;br /&gt;
&lt;br /&gt;
 preg_replace(&amp;#039;/\W/&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
* Innerhalb / / steht der reguläre Ausdruck nach dem Gesucht wird.&lt;br /&gt;
* \W steht für &amp;quot;nicht Buchstabe&amp;quot; (also alles andere soll ersetzt werden)&lt;br /&gt;
&lt;br /&gt;
Probleme gibt es bei utf-8 als Zeichensatz. Deshalb:&lt;br /&gt;
&lt;br /&gt;
 preg_replace(&amp;#039;/\W/u&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
* Der /u Modifier sagt, daß jetzt &amp;#039;&amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;#039; kommt.&lt;br /&gt;
&lt;br /&gt;
Das funktioniert in Windows nicht aber in Linux. Dort zählen die &amp;#039;&amp;#039;&amp;#039;Umlaute&amp;#039;&amp;#039;&amp;#039; nicht zu den Buchstaben (\W) und werden entfernt. Das behebt der Modifier \pL&lt;br /&gt;
&lt;br /&gt;
* \pL steht für Zeichen jeder Sprache. Das \W wird ersetzt durch: &lt;br /&gt;
*  [ ] -&amp;gt; In den Brakets steht eine Charakterklasse &lt;br /&gt;
*  ^ -&amp;gt; steht für nicht&lt;br /&gt;
&lt;br /&gt;
 [^\pL] -&amp;gt; Suche alles was kein (^) Buchstaben jeglicher Sprache (\pL) ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ergebnis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 echo preg_replace(&amp;#039;/\[^\pL]/u&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
=== Suche nicht innerhalb html Tags ===&lt;br /&gt;
&lt;br /&gt;
Erklärung: /e interpretiert den String als php Code /i ignoriert Groß- und Kleinschreibung&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// $s in $t durch $r ersetzen:&lt;br /&gt;
preg_replace(&amp;quot;/((&amp;lt;[^&amp;gt;]*)|$s)/e&amp;quot;, &amp;#039;&amp;quot;\2&amp;quot;==&amp;quot;\1&amp;quot;? &amp;quot;\1&amp;quot;:&amp;quot;$r&amp;quot;&amp;#039;, $t);&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// $s case-insensitive in $t hervorheben:&lt;br /&gt;
preg_replace(&amp;quot;/((&amp;lt;[^&amp;gt;]*)|$s)/ie&amp;quot;, &amp;#039;&amp;quot;\2&amp;quot;==&amp;quot;\1&amp;quot;? &amp;quot;\1&amp;quot;:&amp;quot;&amp;lt;b&amp;gt;\1&amp;lt;/b&amp;gt;&amp;quot;&amp;#039;, $t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
von http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke&lt;br /&gt;
&lt;br /&gt;
Fangen wir mal klein an. Wir wollen prüfen, ob eine Eingabe einer Schulnote von 1-6 entspricht.&lt;br /&gt;
[123456]&lt;br /&gt;
erledigt das für uns. Du siehst: in eckigen Klammern folgt eine Auflistung von Zeichen, die erlaubt sind. Insgesamt steht der gesamte geklammerte Ausdruck aber nur für ein Zeichen: 1 oder 2 oder ... oder 6. &lt;br /&gt;
&lt;br /&gt;
Da unsere Zahlen von 1 bis 6 so schön aufeinanderfolgen, können wir auch schreiben&lt;br /&gt;
[1-6]&lt;br /&gt;
was die Sache etwas übersichtlicher macht. Genau so könnte man z.b. prüfen, ob eine Eingabe einem Gleis auf einem Bahnhof entspricht:&lt;br /&gt;
[1-9]&lt;br /&gt;
für einen Bahnhof mit 9 Gleisen. Auf unserem Bahnhof sei heute Gleis 4 gesperrt, also als Eingabe nicht erlaubt:&lt;br /&gt;
[1-35-9]&lt;br /&gt;
Wir haben den Eingabebereich also aufgeteilt in zwei Bereiche 1-3 und 5-9. Du siehst: Die beiden Bereiche werden einfach hintereinander geschrieben. Das ist am Anfang gewöhnungsbedürftig (intuitiv möchte man vielleicht ein Leerzeichen machen), aber das wird uns noch öfter begegnen.&lt;br /&gt;
Mehrelementige reguläre Ausdrücke&lt;br /&gt;
&lt;br /&gt;
Was ist, wenn auf unserem Bahnhof jetzt angebaut wird? Sagen wir, er wird auf 12 Gleise erweitert:&lt;br /&gt;
[1-12]&lt;br /&gt;
(Gleis 4 sei wieder geöffnet ;-) ). Aber Vorsicht, hier ist ein Fehler drin! &lt;br /&gt;
&lt;br /&gt;
Wie oben erwähnt, steht der gesamte Ausdruck in den eckigen Klammern nur für ein Zeichen. &amp;quot;12&amp;quot; enthält aber zwei Zeichen. Der Code oben wird nicht funktionieren: Er bedeutet &amp;quot;1 bis 1&amp;quot; oder &amp;quot;2&amp;quot;. Den Umgang mit Bahnhöfen mit mehr als 9 Gleisen demonstrieren wir später. &lt;br /&gt;
&lt;br /&gt;
Für den Moment wollen wir etwas anderes Prüfen: Bahnsteige 1-9 haben noch jeweils Abschnitt &amp;quot;a&amp;quot; und &amp;quot;b&amp;quot;. Wir wollen also auf 1a,1b,2a,...,9a,9b prüfen:&lt;br /&gt;
[1-9][ab]&lt;br /&gt;
Will heißen: Eine Zahl 1-9 gefolgt von einem Buchstaben a oder b. &lt;br /&gt;
&lt;br /&gt;
Mehrere rechteckige Klammern entsprechen also mehreren Zeichen. Soll ein Ausdruck mehrere Zeichen beschreiben, werden diese einfach hintereinander gehangen. Dann wird die Eingabe von links nach rechts mit deinem Ausdruck verglichen. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich müssen auch nicht immer alle Buchstaben aufgeführt werden:&lt;br /&gt;
[1-9][a-d]&lt;br /&gt;
trifft jetzt auch z.B. 4d. &lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass Groß- und Kleinschreibung getrennt behandelt wird. Eine sinnvolle Erweiterung wäre also z.B.&lt;br /&gt;
[1-9][a-dA-D]&lt;br /&gt;
Optionen&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die Eingabe einer Hausnummer an. Diese können aus einer oder mehreren (bis zu 3) Ziffern bestehen und ein a-z am Ende haben. Müssen aber nicht.&lt;br /&gt;
[1-9][0-9]?[0-9]?[a-z]?&lt;br /&gt;
Das Fragezeichen hinter einem Element (und [1-9] ist ein Element!) besagt: Das vorhergehende Element kann vorkommen, muss aber nicht. &lt;br /&gt;
&lt;br /&gt;
Der letzte Code heißt also: Eine Ziffer (1-9), optional zwei weitere Ziffern (0-9), optional ein Buchstabe. &lt;br /&gt;
&lt;br /&gt;
Stellt man sich solch eine Konstruktion mit z.B. 10 Ziffern vor, kann man sich leicht ausmalen, dass sie schnell sehr lang wird. Daher gibt es eine andere Schreibweise, wenn man ein Element mehr als ein mal erlauben will:&lt;br /&gt;
a{1,3}h&lt;br /&gt;
Trifft auf &amp;quot;ah&amp;quot; genau so wie auf &amp;quot;aaah&amp;quot;. Die Angabe in Klammern steht also für die {minimale, maximale} Anzahl an Zeichen. Daher können wir unsere Hausnummern auch so formulieren:&lt;br /&gt;
[1-9][0-9]{0,2}[a-z]?&lt;br /&gt;
und dann auch ohne Probleme für längere Straßen (USA ;-) ) umschreiben:&lt;br /&gt;
[1-9][0-9]{1,4}[a-z]?&lt;br /&gt;
erlaubt jetzt auch Hausnummern im fünfstelligen Bereich, fordert aber mindestens eine zweistellige (beachte die Änderung vor dem Komma). &lt;br /&gt;
&lt;br /&gt;
Eine Konstruktion wie&lt;br /&gt;
[0-9]{5}&lt;br /&gt;
(also eine Klammer mit nur einer Angabe) verlangt eine genau x-malige Wiederholung des davorstehenden Ausdrucks. In unserem Fall 5 mal: Dieser reguläre Ausdruck wäre geeignet, um (deutsche) Postleitzahlen zu prüfen. &lt;br /&gt;
&lt;br /&gt;
Wir könne auch ein &amp;quot;mindestens&amp;quot; ausdrücken:&lt;br /&gt;
[0-9]{3,}&lt;br /&gt;
fordert eine mindestens 3-malige Wiederholung einer Ziffer.&lt;br /&gt;
Beliebige Wiederholungen&lt;br /&gt;
&lt;br /&gt;
Bisher mussten wir immer wissen, wieviele Zeichen gefunden werden sollen. Es gibt aber durchaus Fälle, in denen sich ein Zeichen beliebig oft wiederholen darf. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die Prüfung von Telefonnummern an. Wenn man einen regulären Ausdruck schreibt, empfiehlt es sich oft, zunächst einmal zu notieren, auf was dieser alles treffen soll. Unsere Telefonnummern sollen von diesem Format sein dürfen:&lt;br /&gt;
0651/55541-36&lt;br /&gt;
0049 160 555678&lt;br /&gt;
0180.23.555.63&lt;br /&gt;
Es können neben Zahlen also auch Bindestriche, Querstriche, Leerzeichen und Punkte vorkommen. Ein gültiges Element wäre also&lt;br /&gt;
[0-9/. -]&lt;br /&gt;
(Also: Dieses eine Zeichen besteht aus einer Zahl zwischen 0 und 9 oder einem Slash oder einem Punkt oder einem Leerzeichen oder einem Minus.) Doch Vorsicht! Wie du siehst, kommen in den Klammern zwei Bindestriche vor: ein mal in einer speziellen Funktion, um einen Zahlenbereich anzudeuten und ein mal als &amp;quot;echter&amp;quot; Bindestrich, der so auftauchen darf. Um Verwechslungen auszuschließen müssen wir letzteren maskieren, also zeigen dass er hier keine spezielle Funktion hat. Das geht mit einem vorangestellten Backslash:&lt;br /&gt;
[0-9/. \-]&lt;br /&gt;
Und dann wollen wir ja noch mitteilen, dass diese Zeichen beliebig oft vorkommen dürfen:&lt;br /&gt;
[0-9/. \-]+&lt;br /&gt;
Das Plus bedeutet: ein oder mehrmals das davor befindliche Zeichen, also mindestens ein mal. Wollen wir auch eine leere Telefonnummer zulassen (der Mathematiker würde sagen: Die Nullnummer), so gibt es dazu ein anderes Zeichen:&lt;br /&gt;
[0-9/. \-]*&lt;br /&gt;
trifft jetzt auch auf &amp;quot;&amp;quot; (leere Zeichenkette) und natürlich unsere Telefonnummern. &lt;br /&gt;
&lt;br /&gt;
Also nochmal zusammengefasst: Das + steht für eine mindestens einmalige Wiederholung. * heißt: keinmal oder beliebig oft.&lt;br /&gt;
Platzhalter&lt;br /&gt;
&lt;br /&gt;
Gehen wir zu einem anderen Beispiel über: Wir möchten in einer Bibliothek nach einem Autor suchen, wissen aber nicht, ob er evtl. einen zweiten Vornamen hat. Nach dem Vornamen können also beliebige Zeichen kommen und danach dann erst der Nachname. Eine mögliche Lösung sieht so aus:&lt;br /&gt;
Marius .*Osterhase&lt;br /&gt;
Die im Einzelnen bedeutet: &amp;quot;Marius&amp;quot;, danach ein Leerzeichen gefolgt von einem beliebigen Zeichen (dafür steht der Punkt!) beliebig oft (also evtl. auch gar keins) und anschließend der Nachname. Das trifft auf &amp;quot;Marius Osterhase&amp;quot; genau so wie auf &amp;quot;Marius Müller Osterhase&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Genau so kann man dem Punkt natürlich auch ein Plus folgen lassen, um mindestens ein beliebiges Zeichen zu fordern. &lt;br /&gt;
&lt;br /&gt;
Der Punkt &amp;quot;frisst&amp;quot; normalerweise zwar fast alles, aber keine Zeilenumbrüche. Wie du ihn dazu bringst, findest du unter Modifikatoren. &lt;br /&gt;
&lt;br /&gt;
Dem &amp;quot;aufmerksamen Leser&amp;quot; wird nicht entgangen sein, dass wir oben auch schon einen Punkt hatten, und zwar innerhalb der eckigen Klammern. Wie bei vielen, aber nicht allen Sonderzeichen müssen diese zwar außerhalb von eckigen Klammern als solche maskiert werden (Backslash davor), aber nicht innerhalb.&lt;br /&gt;
Zeichenklassen negieren&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wüssten den zweiten Vornamen des Autors nicht genau, aber können uns daran erinnern, dass er kein q und kein z enthält. Auch kein Problem:&lt;br /&gt;
Marius [^qz]+ Osterhase&lt;br /&gt;
verlangt nach einem zweiten Vornamen (deswegen das Plus) und lässt dazu ein beliebiges Zeichen zu, das nicht q oder z ist. Das ^ negiert also eine Zeichenklasse und gilt genau bis zur schließenden Klammer.&lt;br /&gt;
Klammern&lt;br /&gt;
&lt;br /&gt;
Klammern können dazu benutzt werden, längere Ausdrücke zu einem Element zusammenzufassen und es damit zu ermöglichen, das oben gelernte auch auf Teilausdrücke anzuwenden:&lt;br /&gt;
Marius (Müller )?Osterhase&lt;br /&gt;
trifft genau auf &amp;quot;Marius Müller Osterhase&amp;quot; oder &amp;quot;Marius Osterhase&amp;quot; und auf nichts anderes: Das Fragezeichen bezieht sich - dank der Klammern - auf den kompletten zweiten Vornamen und das folgende Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Ebenso lässt sich schreiben:&lt;br /&gt;
Ba(na)*ne&lt;br /&gt;
Was jetzt sowohl für dieses gelbe Ding als auch z.B. für &amp;quot;Banananane&amp;quot; steht. Auch hier lässt sich die Notation mit den geschweiften Klammern anwenden:&lt;br /&gt;
Ba(na){2,5}ne&lt;br /&gt;
was jetzt natürlich eine entsprechend andere Bedeutung hat.&lt;br /&gt;
Alternativen&lt;br /&gt;
&lt;br /&gt;
Mit Klammern kann man aber auch noch andere Sachen machen, z.B. Alternativen zu einem Teilausdruck angeben:&lt;br /&gt;
Das Wetter ist (toll|richtig schlecht)&lt;br /&gt;
In diesem Beispiel dürfen als letzte Worte &amp;quot;toll&amp;quot; oder &amp;quot;richtig schlecht&amp;quot; vorkommen, aber nicht beide.&lt;br /&gt;
Modifikatoren&lt;br /&gt;
&lt;br /&gt;
In allen RegEx-Varianten kannst du sogenannte Modifikatoren setzen und damit das genaue Verhalten des Ausdrucks kontrollieren. In Java kannst du dies z.B. bei der Konstruktion eines matcher-Objektes erledigen, bei PHP hat ein regulärer Ausdruck immer die Syntax&lt;br /&gt;
[Begrenzungszeichen][RegEx][Begrenzungszeichen][Modifikator(en)]&lt;br /&gt;
also z.B.&lt;br /&gt;
/(Mein|Ausdruck)/im&lt;br /&gt;
Dabei sind &amp;quot;i&amp;quot; und &amp;quot;m&amp;quot; in diesem Fall Modifikatoren. Gängige Modifikatoren sind unter anderem:&lt;br /&gt;
i Case-Insensitivity (die Nichtbeachtung von Groß- und Kleinschreibung)einschalten&lt;br /&gt;
s Punkt wird multilinefähig: Der Punkt frisst auch Zeilenumbrüche, dies ist standardmäßig nicht so.&lt;br /&gt;
m Zeilenmodus: Die Zeichen ^ und $ passen mit auch auf Zeilenanfänge bzw. -enden. Ohne den Modifikator passen sie nur auf Anfang und Ende der gesamten Zeichenkette.&lt;br /&gt;
Modifikatoren beziehen sich immer auf den ganzen Ausdruck und sind daher eine leicht übersehene Fehlerquelle.&lt;br /&gt;
Kompliziertere Ausdrücke&lt;br /&gt;
&lt;br /&gt;
Verschachtelungen&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich dürfen auch diverse Klammern ineinander geschachtelt werden, wie z.B. in folgendem Ausdruck:&lt;br /&gt;
(VW (Golf|Polo)|Fiat (Punto|Panda))&lt;br /&gt;
welcher auf &amp;quot;VW Golf&amp;quot;, &amp;quot;VW Polo&amp;quot;, &amp;quot;Fiat Punto&amp;quot; und &amp;quot;Fiat Panda&amp;quot; trifft. Dies ermöglich zwar recht kurze Ausdrücke für lange Zeichenketten, kann aber auch viel Zeit zur Verarbeitung in Anspruch nehmen. &lt;br /&gt;
&lt;br /&gt;
Genau so lassen sich auch diese Alternativen wiederholen:&lt;br /&gt;
(10|01)+&lt;br /&gt;
Beschreibt eine Folge aus Nullen und Einsen, in der maximal 2 Nullen oder Einsen aufeinander folgen. (Falls das jetzt nicht direkt klar wird: einfach mal überlegen, was man aus &amp;quot;10&amp;quot; und &amp;quot;01&amp;quot; zusammensetzen kann.)&lt;br /&gt;
Gierige Ausdrücke&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel aus der Praxis: Der folgende, etwas längerer Code soll uns aus einer HTML-Datei die Links bzw. deren Zieladressen heraussuchen. Ein Link in einem HTML-Quellcode hat i.d.R. ein Format wie dieses:&lt;br /&gt;
&amp;lt;a href=&amp;quot;[...Zieladresse...]&amp;quot; [...weitere Angaben...]&amp;gt;&lt;br /&gt;
z.B.&lt;br /&gt;
&amp;lt;a href=&amp;quot;http://www.example.org/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
Ein möglicher Ausdruck dafür ist recht schnell gefunden:&lt;br /&gt;
&amp;lt;a href=&amp;quot;.*&amp;quot;.*&amp;gt;&lt;br /&gt;
Sieht gut aus, klappt aber nicht. Warum? &lt;br /&gt;
&lt;br /&gt;
Der Autor hat sich zwar gedacht der Ausdruck würde an der zu dem Link gehörenden schließenden Klammer aufhören, er tut es aber nicht. Im folgenden ein Ausschnitt aus einer HTML-Datei mit markiertem Treffer:&lt;br /&gt;
&amp;lt;BODY&amp;gt; Bla Blubb 1 2 3 &amp;lt;a href=&amp;quot;http://www.example.org/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; Linktext &amp;lt;/a&amp;gt; Viel, viel weiterer &amp;lt;i&amp;gt;Text&amp;lt;/i&amp;gt; Blubb 42&lt;br /&gt;
Das geht eindeutig zu weit! Der zweite Punkt ist zu &amp;quot;gierig&amp;quot; und frisst alle Zeichen sogar über mehrere schließende spitze Klammern hinweg. In anderen Situationen wäre es denkbar, dass der erste Punkt ähnlich amokläuft. &lt;br /&gt;
&lt;br /&gt;
Für unseren Fall gibt es zwei Lösungsmöglichkeiten. Oft bleibt jedoch nur eine davon, daher stelle ich beide vor:&lt;br /&gt;
Den Punkt ersetzen durch etwas was keine spitzen Klammern mehr frisst:&lt;br /&gt;
&amp;lt;a href=&amp;quot;.*&amp;quot;[^&amp;gt;]*&amp;gt;&lt;br /&gt;
Das ist eine oft anzuwendende Methode (überlege dir, welche Zeichen das Ende markieren und schließe diese von dem zu treffenden aus). Das ganze muss jetzt natürlich noch analog für den ersten Punkt gemacht werden:&lt;br /&gt;
&amp;lt;a href=&amp;quot;[^&amp;quot;]*&amp;quot;[^&amp;gt;]*&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Punkt &amp;quot;umerziehen&amp;quot; (bzw. * genügsam machen) so dass beide zusammen nur noch so viel fressen, wie unbedingt nötig ist. Dies tut ein angehängtes Fragezeichen, was dann natürlich nicht mehr die bisher bekannte Funktion hat:&lt;br /&gt;
&amp;lt;a href=&amp;quot;.*?&amp;quot;.*?&amp;gt;&lt;br /&gt;
Natürlich funktioniert diese Sonderbenutzung des Fragezeichens auch hinter einem Pluszeichen. &lt;br /&gt;
&lt;br /&gt;
Gruppen&lt;br /&gt;
&lt;br /&gt;
So gut wie alle RegEx-Dialekte erlauben das Bilden von Gruppen und deren Speicherung für spätere Verwendung. Auch dazu können Klammern dienen. &lt;br /&gt;
&lt;br /&gt;
Spätere Verwendung kann z.B. heißen, dass ein Ausdruck zwar auf eine längere Zeichenkette treffen soll, aber nur ein Teil davon wirklich verwendet werden soll. &lt;br /&gt;
&lt;br /&gt;
Soetwas wäre in Verbindung mit dem obigen Ausdruck sehr nützlich, um alle Zieladressen aus einer HTML-Seite zu filtern. &lt;br /&gt;
&lt;br /&gt;
Wie genau du an die Inhalte der Gruppen kommst, steht in der Anleitung der von dir verwendeten Sprache. Bei PHP findest du es z.B. bei preg_match und Java soweit ich mich erinnern kann irgendwo in der Nähe von regex.matcher. Google sollte da mehr zu wissen.&lt;br /&gt;
&amp;lt;a href=&amp;quot;(.*?)&amp;quot;.*?&amp;gt;&lt;br /&gt;
Der erste Punkt und seine &amp;quot;Vervielfacher&amp;quot; sind eingeklammert. In der ersten Gruppe befindet sich jetzt also die URL. &lt;br /&gt;
&lt;br /&gt;
Beachte, dass bei der Nummerierung der Gruppen die Reihenfolge der öffnenden Klammer zählt. Das ist wichtig zu beachten bei verschachtelten Klammern. Außerdem zählen normalerweise alle Klammern, auch wenn sie nur zur Ausweisung von Alternativen (s.o.) verwendet werden.&lt;br /&gt;
Referenzen&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen anderen, sehr nützlichen Verwendungszweck für Gruppen. Stell dir vor, du willst in einer Folge von Zahlen (sagen wir sie seien mit einem Leerzeichen voneinander getrennt) all die Zahlen finden, die mit der selben Ziffer beginnen und enden. &lt;br /&gt;
&lt;br /&gt;
Wir haben also&lt;br /&gt;
129 337873 78324 43938 9388 824998 349734&lt;br /&gt;
Dazu können wir solch einen Ausdruck verwenden:&lt;br /&gt;
 ([0-9])[0-9]*\1&lt;br /&gt;
wobei das \1 auf den Inhalt der ersten Klammer verweist (referenziert) und daher an der Stelle von \1 das selbe stehen muss wie in dieser Klammer. Das erste und letzte Zeichen unseres Ausdrucks ist jeweils ein Leerzeichen, um damit das Ende und den Anfang einer Zahl zu kennzeichnen. &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns an, auf was er trifft:&lt;br /&gt;
129 337873 78324 43938 9388 824998 349734&lt;br /&gt;
Wie du siehst, zählt das erste und letzte Leerzeichen auch immer noch zu dem jeweiligen Treffer dazu. Das ist auch kein Wunder, schließlich steht vor und hinter unserem Ausdruck auch jeweils ein Leerzeichen. Das ist nicht wirklich gut, wenn uns dieses Leerzeichen eigentlich gar nicht interessiert. Daher stellt die RegEx-Sprache auch hier ein Mittel zur Verfügung, welches auch funktioniert, wenn wir keine Gruppen benutzen möchten oder können:&lt;br /&gt;
Spezielle Zeichen: Wortgrenzen&lt;br /&gt;
&lt;br /&gt;
Es gibt Zeichen, die stehen zwar im regulären Ausdruck, aber nicht in dem Text, der nachher gematcht wird. Das sagt dir jetzt nichts? Naja, schauen wir uns als ein Beispiel an, wie man obigen Ausdruck ohne die Leerzeichen schreibt:&lt;br /&gt;
\b([0-9])[0-9]*\1\b&lt;br /&gt;
Dieses &amp;quot;\b&amp;quot; ist ein zusammengehöriges Element und kennzeichnet ein Wortanfang oder ein Wortende (also eine Wortgrenze). Kennst du die in Textverarbeitungsprogrammen und Editoren oft verwendete Möglichkeit &amp;quot;Nur ganzes Wort suchen&amp;quot; in der Suchfunktion? Wählst du diese aus, werden z.B. bei einer Suche nach &amp;quot;Kai&amp;quot; statt diesen Treffern&lt;br /&gt;
Kai fährt nach &lt;br /&gt;
Kaiserslautern&lt;br /&gt;
nur noch dieser Treffer gefunden:&lt;br /&gt;
Kai fährt nach &lt;br /&gt;
Kaiserslautern&lt;br /&gt;
Letzteres ließe sich in regulären Ausdrücken so umsetzen bzw. ausdrücken:&lt;br /&gt;
\bKai\b&lt;br /&gt;
Also &amp;quot;Kai&amp;quot; nur, wenn es von Wortgrenzen umgeben ist. Was genau ist überhaupt eine Wortgrenze? Eine Wortgrenze tritt zwischen einem Wort-Zeichen und einem Nichtwortzeichen auf. Hä? (Erklärung folgt!)&lt;br /&gt;
Spezielle Zeichen: Weitere Zeichen&lt;br /&gt;
&lt;br /&gt;
Es gibt - Überraschung! - noch mehr Sonderzeichen, die du verwenden kannst und die eine RegEx schön abkürzen können. Diese bestehen immer aus einem Backslash gefolgt von einem weiteren Zeichen (Buchstaben). Übrigens steht ein großer Buchstabe dabei immer für das Gegenteil eines kleinen.&lt;br /&gt;
\w  \W&lt;br /&gt;
Ein Wort-Zeichen (kleines w) steht genau für [a-zA-Z0-9] und ein Nichtwortzeichen (großes W) steht genau für alles andere, also [^a-zA-Z0-9].&lt;br /&gt;
\d  \D&lt;br /&gt;
Ein Digit, also eine Ziffer von 0-9. Entspricht damit [0-9] und in der Großschreibung [^0-9].&lt;br /&gt;
\b  \B&lt;br /&gt;
Die &amp;quot;kleine&amp;quot; Variante hast du ja oben schon kennengelernt. Ein großes B steht dementsprechend für alle Stellen, an denen keine Wortgrenze auftritt.&lt;br /&gt;
\s  \S&lt;br /&gt;
Die Kleine Variante steht für alle Whitespaces: Das sind so gut wie alle Zeichen, die man nicht sieht. Also Return (bzw. Enter), Leertaste (Space), Tab(ulator).&lt;br /&gt;
\\&lt;br /&gt;
Wenn man mit Backslash, wie du gesehen hast, Sonderzeichen anfängt, muss man ja auch den Backslash selbst irgendwie fabrizieren können, wenn man genau diesen meint. Dies macht man einfach durch einen doppelten solchen. Man sagt: der erste &amp;quot;maskiert&amp;quot; den zweiten.&lt;br /&gt;
\.  \+  \*  \(  \)  \[  \]  \-  \$  \|&lt;br /&gt;
Der Punkt und viele andere Zeichen haben, wie du oben gesehen hast, eine Sonderfunktion. Daher werden sie mittels eines Backslashs von dieser Sonderfunktion abgehalten (&amp;quot;maskiert&amp;quot;). Dies gilt für das Minuszeichen nur innerhalb von Zeichenklassen, dafür darfst du in selbigen bei vielen anderen Zeichen die Backslashs weglassen.&lt;br /&gt;
Anfangs- und Endezeichen&lt;br /&gt;
&lt;br /&gt;
Stell dir vor, du willst ein Datum prüfen, sagen wir mit&lt;br /&gt;
1\.3\.2004&lt;br /&gt;
Und diesen Ausdruck lässt du auf&lt;br /&gt;
11.3.2004&lt;br /&gt;
los. Was kommt raus? Dein Ausdruck wird dir melden, dass er trifft. Ist ja auch irgendwo klar, schließlich steht, wenn man eine Eins weglässt, dein Datum da. Du willst aber, dass das gesamte Datum wie deins aussieht? Gibt\&amp;#039;s da nicht was von Ratiodingsbums? Doch gibts:&lt;br /&gt;
^1\.3\.2004$&lt;br /&gt;
Dieses Dach am Anfang sagt: Treffe nur, wenn hier der zu durchsuchende String anfängt. Und das Dollarzeichen steht für: Treffe nur, wenn genau hier der zu durchsuchende String endet. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man beide auch einzeln einsetzen; Als Beispiel schauen wir uns zwei reguläre Ausdrücke an: Der erste trifft auf einen String, der mit einer Zahl endet. Der zweite trifft auf einen String, der mit einer öffnenden Klammer beginnt. Dabei benutzen wir die oben angegebene Maskierung für die Klammer.&lt;br /&gt;
\d$ &lt;br /&gt;
^\(&lt;br /&gt;
Positive Lookaheads und Lookbehinds&lt;br /&gt;
&lt;br /&gt;
Du hast jetzt Möglichkeiten kennengelernt, wie du Wortgrenzen feststellen kannst, ohne sie selbst wirklich mitzufressen. Es gibt auch eine universelle Möglichkeit. &lt;br /&gt;
&lt;br /&gt;
Als Beispiel soll folgende Zahlenfolge dienen:&lt;br /&gt;
000566403580000345050052301078906040092800100001007680&lt;br /&gt;
Aus dieser Zahlenfolge sollen alle jene Folgen heraufgefischt werden, die drei Ziffern ungleich Null enthalten und von einer Null an jeder Seite begrenzt werden. In unserem Fall also &amp;quot;358&amp;quot;, &amp;quot;345&amp;quot;, &amp;quot;523&amp;quot;, &amp;quot;789&amp;quot;, &amp;quot;928&amp;quot; und &amp;quot;768&amp;quot;. Dazu kannst du folgenden Code benutzen:&lt;br /&gt;
(?&amp;lt;=0)\d{3}(?=0)&lt;br /&gt;
Keine Panik! Zur Erklärung, und wir fangen in der Mitte an: das \d{3} sollte klar sein (3 Ziffern). Davor findest du die Klammer (?&amp;lt;=0). Die Zeichen ?&amp;lt;= musst du &amp;quot;en bloc&amp;quot; betrachten und sie kennzeichnen eine Sonderfunktion für die Klammer. Diese steht damit für &amp;quot;vornedran eine Null&amp;quot;. Und weil &amp;quot;vornedran&amp;quot; in der normalen Leserichtung der westlichen Welt bedeutet, dass die Klammer &amp;quot;rückwärts&amp;quot; schaut, heißt diese Funktion &amp;quot;positive lookbehind&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Genauso mit den Zeichen &amp;quot;?=&amp;quot;, diese weisen der Klammer die Sonderfunktion &amp;quot;hintendran muss ... kommen&amp;quot; zu, in unserem Fall also &amp;quot;hintendran eine Null&amp;quot;. Das ganze nennt sich &amp;quot;positive lookahead&amp;quot;, weil die Klammer &amp;quot;nach vorne&amp;quot; schaut. &lt;br /&gt;
&lt;br /&gt;
Unser &amp;quot;\b&amp;quot;-Beispiel von oben könnten wir also auch folgendermaßen ausdrücken, wenn wir unser Wissen über &amp;quot;\W&amp;quot; benutzen:&lt;br /&gt;
(?&amp;lt;=\W)(\d)\d*\1(?=\W)&lt;br /&gt;
Zur Erklärung fangen wir wieder in der Mitte an: Da steht der von oben bekannte Code (Eine Ziffer, beliebig viele weitere Ziffern und eine weitere Ziffer, die die gleiche wie die erste ist). Die allererste Klammer fordert vor der ersten Ziffer ein Nichtwortzeichen und die allerletzte Klammer ein Nichtwortzeichen hinter der letzten Ziffer. &lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können lookaheads und lookbehinds auch einzeln in einem regulären Ausdruck vorkommen und sogar mehrfach. Das einzige, was nicht geht, ist ein lookbehind mit einer unbekannten Anzahl von Zeichen. (also so Dingern wie *, + und {0,4}) &lt;br /&gt;
&lt;br /&gt;
Alles klar? Wenn nicht, dann zurück zum Anfang dieses Abschnitts, gehe nicht über &amp;quot;Los&amp;quot; und ziehe keine 200 RegExen ein.&lt;br /&gt;
Negative Lookaheads und Lookbehinds&lt;br /&gt;
&lt;br /&gt;
Du hast das kompliziert gefunden und siehst so langsam ein, wie voodoo reguläre Ausdrücke sind? Es kommt noch besser. &lt;br /&gt;
&lt;br /&gt;
Dazu noch ein Beispiel: Du willst eine E-Mail-Adresse prüfen, die aber nicht aus Frankreich stammen soll. Zunächst schauen wir uns eine einfache E-Mail-Adressen-Prüfung ohne die Einschränkung an:&lt;br /&gt;
[^@]+@.+\.[^.]+&lt;br /&gt;
(Ein Zeichen ungleich dem @-Zeichen, gefolgt von einem @-Zeichen, beliebigen Zeichen (aber mindestens eins), einem Punkt und dahinter beliebige Zeichen, aber kein Punkt mehr. Trifft auf toll@example.com genau so wie auf viele_.Zeichen@noch.mehr.Punkte.example.com.) Wichtig: das letzte Paar von eckigen Klammern frisst immer den letzten Teil (die Top-Level-Domain, im Beispiel &amp;quot;com&amp;quot;) der E-Mail-Adresse. &lt;br /&gt;
&lt;br /&gt;
Jetzt fügen wir eine Beschränkung ein und wollen &amp;quot;fr&amp;quot; an dieser Stelle ausschließen. Auf den Punkt darf also nicht &amp;quot;fr&amp;quot; folgen.&lt;br /&gt;
[^@]+@.+\.(?!fr)[^.]+&lt;br /&gt;
erledigt das für uns. ?! kennzeichnet eine Klammer also als &amp;quot;hier darf nicht folgen&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Damit könnte man auch eine besondere Suche nach einem Wort gestalten.&lt;br /&gt;
\bF(?!eta\b).*\b&lt;br /&gt;
trifft auf alle Wörter, die mit &amp;quot;F&amp;quot; anfangen, aber ungleich &amp;quot;Feta&amp;quot; sind. Im folgenden Text sind alle Strings markiert, die getroffen werden:&lt;br /&gt;
Fett Feta Falsch Feucht Fuffziger&lt;br /&gt;
Das war der &amp;quot;negative lookahead&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Und weils so schön war, leg ich noch einen drauf, den &amp;quot;negative lookbehind&amp;quot;:&lt;br /&gt;
.*(?&amp;lt;!Müll)eimer&lt;br /&gt;
trifft auf alle Eimer, in die kein Müll gehört, meint also: &amp;quot;treffe an dieser Stelle, wenn davor kein &amp;quot;Müll&amp;quot; steht&amp;quot;.&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Regul%C3%A4re_Ausdr%C3%BCcke_(RegEx)&amp;diff=20333</id>
		<title>Reguläre Ausdrücke (RegEx)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Regul%C3%A4re_Ausdr%C3%BCcke_(RegEx)&amp;diff=20333"/>
		<updated>2014-07-23T07:30:22Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
http://www.regular-expressions.info/reference.html&lt;br /&gt;
&lt;br /&gt;
http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke&lt;br /&gt;
&lt;br /&gt;
http://weppz.com/tipps/preg_replace-utf-8-und-umlaute/&lt;br /&gt;
&lt;br /&gt;
http://www.hongkiat.com/blog/regular-expression-tools-resources/&lt;br /&gt;
&lt;br /&gt;
=== RegEx in Apache Mod Rewrite Engine ===&lt;br /&gt;
[[Apache Mod Rewrite Syntax]]&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für Such- und Ersetzungsfunktionen mit preg_replace, preg_match etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/ oder # müssen an anfang und ende!&lt;br /&gt;
&lt;br /&gt;
. entspricht einem beliebigen Zeichen ( also Buchstaben,Zahlen,sonderzeichen,bindestriche,usw.).&lt;br /&gt;
+ entspricht anzahl &amp;gt;= 1&lt;br /&gt;
.+ entspricht mehreren beliebigen Zeichen&lt;br /&gt;
* entspricht anzahl &amp;gt;= 0&lt;br /&gt;
.* entspricht kein oder mehrere beliebigen Zeichen&lt;br /&gt;
? entspricht einem Zeichen&lt;br /&gt;
.? entspricht kein oder ein beliebiges Zeichen&lt;br /&gt;
| entspricht der OR bzw. ODER Verknüpfung&lt;br /&gt;
^ entspricht zweierlei: einmal der NOT bzw. NICHT Verknüpfung(aber nur in der [] klammer) und anderesmal, dass das folgende zeichen am anfang stehen muss.&lt;br /&gt;
&lt;br /&gt;
alle oben genannten zeichen müssen als echte zeichen mit dem \ maskiert werden, also z.B. \. entspricht dann dem .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\w entspricht einem Buchstabe&lt;br /&gt;
\w+ entsprcht mehreren (oder einem) Buchstaben&lt;br /&gt;
\d entspricht einer Zahl&lt;br /&gt;
\d+ entspricht mehreren (oder einer) Zahlen&lt;br /&gt;
&lt;br /&gt;
() entspricht einer Gruppe, wird also gespeichert. Die Erste Gruppe kann nachher bei preg_replace im replacement als $1 angegeben werden, die zweite als $2 usw.&lt;br /&gt;
(\w+) entspricht mehreren gespeicherten Buchstaben&lt;br /&gt;
[] entspricht einem Bereich&lt;br /&gt;
[a-z] entspricht den kleinen Buchstaben a bis z&lt;br /&gt;
[A-Z] entspricht den grossen Buchstaben A bis Z&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Umlaute und Sonderzeichen ===&lt;br /&gt;
Quelle s.o. bei Links&lt;br /&gt;
&lt;br /&gt;
Angenommen es sollen alle &amp;#039;&amp;#039;&amp;#039;Sonderzeichen&amp;#039;&amp;#039;&amp;#039; aus dem Satz “Grüß mich, sonst gibt’s Ärger!” entfernt und durch Leerzeichen ersetzt werden. &lt;br /&gt;
&lt;br /&gt;
 preg_replace(&amp;#039;/\W/&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
* Innerhalb / / steht der reguläre Ausdruck nach dem Gesucht wird.&lt;br /&gt;
* \W steht für &amp;quot;nicht Buchstabe&amp;quot; (also alles andere soll ersetzt werden)&lt;br /&gt;
&lt;br /&gt;
Probleme gibt es bei utf-8 als Zeichensatz. Deshalb:&lt;br /&gt;
&lt;br /&gt;
 preg_replace(&amp;#039;/\W/u&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
* Der /u Modifier sagt, daß jetzt &amp;#039;&amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;#039; kommt.&lt;br /&gt;
&lt;br /&gt;
Das funktioniert in Windows nicht aber in Linux. Dort zählen die &amp;#039;&amp;#039;&amp;#039;Umlaute&amp;#039;&amp;#039;&amp;#039; nicht zu den Buchstaben (\W) und werden entfernt. Das behebt der Modifier \pL&lt;br /&gt;
&lt;br /&gt;
* \pL steht für Zeichen jeder Sprache. Das \W wird ersetzt durch: &lt;br /&gt;
*  [ ] -&amp;gt; In den Brakets steht eine Charakterklasse &lt;br /&gt;
*  ^ -&amp;gt; steht für nicht&lt;br /&gt;
&lt;br /&gt;
 [^\pL] -&amp;gt; Suche alles was kein (^) Buchstaben jeglicher Sprache (\pL) ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ergebnis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 echo preg_replace(&amp;#039;/\[^\pL]/u&amp;#039;, &amp;#039; &amp;#039;, &amp;quot;Grüß mich, sonst gibt&amp;#039;s Ärger!&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
=== Suche nicht innerhalb html Tags ===&lt;br /&gt;
&lt;br /&gt;
Erklärung: /e interpretiert den String als php Code /i ignoriert Groß- und Kleinschreibung&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// $s in $t durch $r ersetzen:&lt;br /&gt;
preg_replace(&amp;quot;/((&amp;lt;[^&amp;gt;]*)|$s)/e&amp;quot;, &amp;#039;&amp;quot;\2&amp;quot;==&amp;quot;\1&amp;quot;? &amp;quot;\1&amp;quot;:&amp;quot;$r&amp;quot;&amp;#039;, $t);&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// $s case-insensitive in $t hervorheben:&lt;br /&gt;
preg_replace(&amp;quot;/((&amp;lt;[^&amp;gt;]*)|$s)/ie&amp;quot;, &amp;#039;&amp;quot;\2&amp;quot;==&amp;quot;\1&amp;quot;? &amp;quot;\1&amp;quot;:&amp;quot;&amp;lt;b&amp;gt;\1&amp;lt;/b&amp;gt;&amp;quot;&amp;#039;, $t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_ValidationEngine&amp;diff=20332</id>
		<title>JQuery - ValidationEngine</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_ValidationEngine&amp;diff=20332"/>
		<updated>2014-07-22T10:41:18Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mächtiges und recht einfaches JavaScript Tool zur Validierung von Formularen. Fehleranzeige in Sprechblasen direkt am Eingabefeld.&lt;br /&gt;
== Links ==&lt;br /&gt;
http://posabsolute.github.io/jQuery-Validation-Engine/&lt;br /&gt;
&lt;br /&gt;
==Quickstart==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Einbinden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;css/validationEngine.jquery.css&amp;quot; type=&amp;quot;text/css&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery-1.8.2.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery.validationEngine-en.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery.validationEngine.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Initialisieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 $(&amp;quot;#form.id&amp;quot;).validationEngine(action or options);&lt;br /&gt;
&lt;br /&gt;
===Erweitern===&lt;br /&gt;
Über jquery.validationEngine-en.js (oder die anderen Lokalisierungsdateien kann man neue Validierungen hinzufügen oder die error messages ändern.&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Ein paar Beispiele von: http://it.post80s.com/jquery-form-validation (Zugriff 2013-08)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;At least one&amp;#039;&amp;#039;&amp;#039; of the field of the group must be filled. It needs to be given a group name that is unique across the form.&lt;br /&gt;
 &amp;lt;input value=&amp;quot;&amp;quot; class=&amp;quot;validate[groupRequired[payments]]&amp;quot; type=&amp;quot;text&amp;quot; name=&amp;quot;creditcard&amp;quot; id=&amp;quot;creditcard&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[groupRequired[payments]]&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;paypal&amp;quot; name=&amp;quot;paypal&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following example, enforces a &amp;#039;&amp;#039;&amp;#039;minimum of two selected&amp;#039;&amp;#039;&amp;#039; checkboxes&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck1&amp;quot; value=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck2&amp;quot; value=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck3&amp;quot; value=&amp;quot;9&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note how the input.name is identical across the fields.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Radios&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio1&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;5&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio2&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;3&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio3&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;9&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Password fields&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;NewPwd&amp;quot; id=&amp;quot;NewPwd&amp;quot; value=&amp;quot;123&amp;quot; class=&amp;quot;validate[required] text-input&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input type=&amp;quot;password&amp;quot;&lt;br /&gt;
 name=&amp;quot;NewPwd2&amp;quot; id=&amp;quot;NewPwd2&amp;quot; class=&amp;quot;validate[required,equals[NewPwd]] text-input&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can run &amp;#039;&amp;#039;&amp;#039;other functions&amp;#039;&amp;#039;&amp;#039; after the form is validated and before the form is submitted:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
jQuery(document).ready(function(){&lt;br /&gt;
    jQuery(&amp;quot;#fCompanyEdit&amp;quot;).validationEngine({&lt;br /&gt;
         promptPosition : &amp;quot;centerRight&amp;quot;&lt;br /&gt;
        ,onAjaxFormComplete: function(status,form) {&lt;br /&gt;
          if (status === true) {&lt;br /&gt;
            return pageLoad_onsubmit();&lt;br /&gt;
            form.submit();&lt;br /&gt;
          }&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_ValidationEngine&amp;diff=20331</id>
		<title>JQuery - ValidationEngine</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_ValidationEngine&amp;diff=20331"/>
		<updated>2014-07-22T10:39:43Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mächtiges und recht einfaches JavaScript Tool zur Validierung von Formularen. Fehleranzeige in Sprechblasen direkt am Eingabefeld.&lt;br /&gt;
== Links ==&lt;br /&gt;
http://posabsolute.github.io/jQuery-Validation-Engine/&lt;br /&gt;
&lt;br /&gt;
==Quickstart==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Einbinden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;css/validationEngine.jquery.css&amp;quot; type=&amp;quot;text/css&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery-1.8.2.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery.validationEngine-en.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery.validationEngine.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Initialisieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 $(&amp;quot;#form.id&amp;quot;).validationEngine(action or options);&lt;br /&gt;
&lt;br /&gt;
===Erweitern===&lt;br /&gt;
Über jquery.validationEngine-en.js (oder die anderen Lokalisierungsdateien kann man neue Validierungen hinzufügen oder die error messages ändern.&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Ein paar Beispiele von: http://it.post80s.com/jquery-form-validation (Zugriff 2013-08)&lt;br /&gt;
&lt;br /&gt;
At least one of the field of the group must be filled. It needs to be given a group name that is unique across the form.&lt;br /&gt;
 &amp;lt;input value=&amp;quot;&amp;quot; class=&amp;quot;validate[groupRequired[payments]]&amp;quot; type=&amp;quot;text&amp;quot; name=&amp;quot;creditcard&amp;quot; id=&amp;quot;creditcard&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[groupRequired[payments]]&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;paypal&amp;quot; name=&amp;quot;paypal&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following example, enforces a minimum of two selected checkboxes&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck1&amp;quot; value=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck2&amp;quot; value=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck3&amp;quot; value=&amp;quot;9&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note how the input.name is identical across the fields.&lt;br /&gt;
&lt;br /&gt;
radios&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio1&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;5&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio2&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;3&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio3&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;9&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Password fields&lt;br /&gt;
 &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;NewPwd&amp;quot; id=&amp;quot;NewPwd&amp;quot; value=&amp;quot;123&amp;quot; class=&amp;quot;validate[required] text-input&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input type=&amp;quot;password&amp;quot;&lt;br /&gt;
 name=&amp;quot;NewPwd2&amp;quot; id=&amp;quot;NewPwd2&amp;quot; class=&amp;quot;validate[required,equals[NewPwd]] text-input&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can run other functions after the form is validated and before the form is submitted:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
jQuery(document).ready(function(){&lt;br /&gt;
    jQuery(&amp;quot;#fCompanyEdit&amp;quot;).validationEngine({&lt;br /&gt;
         promptPosition : &amp;quot;centerRight&amp;quot;&lt;br /&gt;
        ,onAjaxFormComplete: function(status,form) {&lt;br /&gt;
          if (status === true) {&lt;br /&gt;
            return pageLoad_onsubmit();&lt;br /&gt;
            form.submit();&lt;br /&gt;
          }&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_ValidationEngine&amp;diff=20330</id>
		<title>JQuery - ValidationEngine</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_ValidationEngine&amp;diff=20330"/>
		<updated>2014-07-22T08:43:40Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mächtiges und recht einfaches JavaScript Tool zur Validierung von Formularen. Fehleranzeige in Sprechblasen direkt am Eingabefeld.&lt;br /&gt;
&lt;br /&gt;
==Quickstart==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Einbinden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;css/validationEngine.jquery.css&amp;quot; type=&amp;quot;text/css&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery-1.8.2.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery.validationEngine-en.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js/jquery.validationEngine.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Initialisieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 $(&amp;quot;#form.id&amp;quot;).validationEngine(action or options);&lt;br /&gt;
&lt;br /&gt;
===Erweitern===&lt;br /&gt;
Über jquery.validationEngine-en.js (oder die anderen Lokalisierungsdateien kann man neue Validierungen hinzufügen oder die error messages ändern.&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Ein paar Beispiele von: http://it.post80s.com/jquery-form-validation (Zugriff 2013-08)&lt;br /&gt;
&lt;br /&gt;
At least one of the field of the group must be filled. It needs to be given a group name that is unique across the form.&lt;br /&gt;
 &amp;lt;input value=&amp;quot;&amp;quot; class=&amp;quot;validate[groupRequired[payments]]&amp;quot; type=&amp;quot;text&amp;quot; name=&amp;quot;creditcard&amp;quot; id=&amp;quot;creditcard&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[groupRequired[payments]]&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;paypal&amp;quot; name=&amp;quot;paypal&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following example, enforces a minimum of two selected checkboxes&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck1&amp;quot; value=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck2&amp;quot; value=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;input class=&amp;quot;validate[minCheckbox[2]]&amp;quot; type=&amp;quot;checkbox&amp;quot; name=&amp;quot;group1&amp;quot; id=&amp;quot;maxcheck3&amp;quot; value=&amp;quot;9&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Note how the input.name is identical across the fields.&lt;br /&gt;
&lt;br /&gt;
radios&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio1&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;5&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio2&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;3&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input id=&amp;quot;radio3&amp;quot; class=&amp;quot;validate[required] radio&amp;quot; type=&amp;quot;radio&amp;quot; value=&amp;quot;9&amp;quot; name=&amp;quot;group0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Password fields&lt;br /&gt;
 &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;NewPwd&amp;quot; id=&amp;quot;NewPwd&amp;quot; value=&amp;quot;123&amp;quot; class=&amp;quot;validate[required] text-input&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;input type=&amp;quot;password&amp;quot;&lt;br /&gt;
 name=&amp;quot;NewPwd2&amp;quot; id=&amp;quot;NewPwd2&amp;quot; class=&amp;quot;validate[required,equals[NewPwd]] text-input&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can run other functions after the form is validated and before the form is submitted:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
jQuery(document).ready(function(){&lt;br /&gt;
    jQuery(&amp;quot;#fCompanyEdit&amp;quot;).validationEngine({&lt;br /&gt;
         promptPosition : &amp;quot;centerRight&amp;quot;&lt;br /&gt;
        ,onAjaxFormComplete: function(status,form) {&lt;br /&gt;
          if (status === true) {&lt;br /&gt;
            return pageLoad_onsubmit();&lt;br /&gt;
            form.submit();&lt;br /&gt;
          }&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions_programmieren&amp;diff=20329</id>
		<title>Typo3 - Extensions programmieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions_programmieren&amp;diff=20329"/>
		<updated>2014-07-21T06:44:09Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Weiterführende Links:&lt;br /&gt;
&lt;br /&gt;
http://wiki.typo3.org/Extension_Developers_Guide&lt;br /&gt;
&lt;br /&gt;
[[Typo3 - Backend Module programmieren (Extensions)]]&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/api/&lt;br /&gt;
&lt;br /&gt;
http://wiki.typo3.org/De:Create_your_own_extension&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/3/2/#id4144512&lt;br /&gt;
&lt;br /&gt;
(High Priority Functions)&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
[[Typo3 Extension Developer Templates]]&lt;br /&gt;
== Wie fange ich an ? ==&lt;br /&gt;
Was möchtest du tun?&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ein vorhandenes Inhaltselement verändern, z.B. Felder hinzufügen oder ein neues Erstellen.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extensions - Inhaltstypen anlegen und bearbeiten]]&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel dafür ist die Extension metatags die den Inhaltselementen Text mit Bild und Bild zusätzliche Felder für Alt und Title Tag hinzufügt.&lt;br /&gt;
&lt;br /&gt;
== Extensions Programmieren in der Praxis ==&lt;br /&gt;
=== TYPO3 Extensions - Links richtig anlegen ===&lt;br /&gt;
[[TYPO3 Extensions programmieren - Links]]&lt;br /&gt;
=== Typo3 Extensions - Sicherheit ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Security Tipps]]&lt;br /&gt;
=== JavaScript in Typo3 Extensions ===&lt;br /&gt;
[[Typo3 - JavaScript einbinden]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 und AJAX ===&lt;br /&gt;
[[AJAX in TYPO3 Extensions]]&lt;br /&gt;
&lt;br /&gt;
=== TypoScript in Extensions ===&lt;br /&gt;
[[TypoScript Einstellungen in Extensions auslagern]]&lt;br /&gt;
&lt;br /&gt;
=== Frontend Plugin ===&lt;br /&gt;
[[Typo3 Extensions - ein Frontend Plugin Programmieren]]&lt;br /&gt;
=== IRRE ===&lt;br /&gt;
[[Typo3 Extensions mit IRRE]]&lt;br /&gt;
&lt;br /&gt;
Das IRRE Konzept hilft beim erstellen von Extensions mit &amp;quot;echten&amp;quot; relationalen Datenbankabfragen&lt;br /&gt;
=== FlexForms ===&lt;br /&gt;
[[Typo3 Extensions mit FlexForms]]&lt;br /&gt;
&lt;br /&gt;
=== Backendformulare ===&lt;br /&gt;
[[Typo3 Extensions - Backend Formulare und TCA Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
siehe auch&lt;br /&gt;
&lt;br /&gt;
http://wiki.zone30.info/wikizone/index.php/Typo3_-_Extensions_programmieren#Formulare_im_Backend&lt;br /&gt;
&lt;br /&gt;
=== Erweitern von Funktionalitäten mit Hooks ===&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel findet sich hier unter Funktionen vor oder nach der Backendeingabe ausführen: &lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extensions - Backend Formulare und TCA Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
Eine schöne Einführung von Typo3 Blogger:&lt;br /&gt;
[[Typo3 - Alles über Hooks]]&lt;br /&gt;
&lt;br /&gt;
=== Arbeiten mit Templates ===&lt;br /&gt;
[[Typo3 Extensions - Arbeiten mit Templates]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Snippets ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Snippets]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Rich Text Editor (RTE) ===&lt;br /&gt;
[[Typo3 Extensions programmieren - RTE]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Session Verwaltung ===&lt;br /&gt;
Siehe auch Sessions in Typo3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standardmäßig gibt es Sessions für eingeloggte Frontend User Session und Browser Sessions&lt;br /&gt;
&lt;br /&gt;
Browser Session Variable setzen&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;,&amp;quot;zaehler&amp;quot;, $wert);&lt;br /&gt;
und auslesen:&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;ses&amp;quot;,&amp;quot;zaehler&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Bei der User Session wird statt &amp;#039;ses&amp;#039; &amp;#039;user&amp;#039; als 1. Parameter verwendet&lt;br /&gt;
Beispiele User Session: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $this-&amp;gt;lastSelection[&amp;#039;filters&amp;#039;][&amp;#039;sem&amp;#039;] = 0;&lt;br /&gt;
 //User SEssion Data lesen&lt;br /&gt;
 $this-&amp;gt;lastSelection = $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;user&amp;quot;,&amp;quot;lastSelection&amp;quot;);&lt;br /&gt;
 // User Session Data schreiben&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;user&amp;quot;,&amp;quot;lastSelection&amp;quot;,$this-&amp;gt;lastSelection);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ein weiterer netter Artikel von Tim Lochmüller aus typo3weblog.de&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Diesmal geht es um die Benutzung der Session in TYPO3. In der Regel genügt nur eine Zeile Code um einen Wert in die Session zu schreiben oder wieder heraus zu holen. Schauen wir uns erstmal an, wie man etwas in die Session schreibt:&lt;br /&gt;
&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;, $data);&lt;br /&gt;
&lt;br /&gt;
Die Funktion setKey() erwartet drei Parameter:&lt;br /&gt;
&lt;br /&gt;
# Type: Dieser kann &amp;quot;ses&amp;quot; oder &amp;quot;user&amp;quot; sein.&lt;br /&gt;
# Key: Eindeutiger Ident für eine Session Variable&lt;br /&gt;
# Data: Die Daten die gespeichert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die beiden Typen &amp;quot;ses&amp;quot; und &amp;quot;user&amp;quot; unterscheiden sich wesentlich. Während der Typ &amp;quot;ses&amp;quot; nur temporär die Daten speichert, also genau so lange, wie die Session besteht (Session-Cookie), ist es mit dem Key &amp;quot;user&amp;quot; möglich, die Daten auch über mehrere Sessions hinweg zu speichern, wobei diese an den FE-User gekoppelt werden.&lt;br /&gt;
&lt;br /&gt;
Der Key sollte so gewählt werden, dass man nicht in Konflikt mit anderen Extensions kommt. Am besten benutzt man seinen Extension-Key dafür.&lt;br /&gt;
&lt;br /&gt;
Die Daten die man speichern will kann jede beliebige PHP Variable sein, sogar komplette Objekte kann man ablegen.&lt;br /&gt;
&lt;br /&gt;
So, nun wollen wir uns den Wert mal wieder raus holen, auch dies geht sehr schnell und einfach:&lt;br /&gt;
&lt;br /&gt;
 $data = $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;getKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Die Methode getKey erwartet nur zwei Parameter, die Bedeutung ist die gleiche wie bei setKey().&lt;br /&gt;
&lt;br /&gt;
Das Leben kann so einfach sein, wenn es nicht ab und an diese kleinen fiesen Sonderfälle gibt ;)&lt;br /&gt;
&lt;br /&gt;
Nehmen wir mal an, man erzeugt ein PDF oder eine AJAX-Antwort, dann gibt man das PDF aus und steigt mit einem exit() oder die() aus. In diesen Fällen, reicht ein einfacher Aufruf von setKey() nicht aus. Denn TYPO3 kann dann die Daten nicht automatisch speichern. Aber hier schafft der folgende Code Abhilfe:&lt;br /&gt;
&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;setKey(&amp;quot;ses&amp;quot;, &amp;quot;tx_myext&amp;quot;, $data);&lt;br /&gt;
 $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;fe_user-&amp;gt;storeSessionData();&lt;br /&gt;
&lt;br /&gt;
Mit storeSessionData() sorgen wir dafür, dass TYPO3 umgehend die Werte speichert. Sehr häufig wird gerade auf die letzte Zeile verzichtet, was in der Regel auch funktioniert, jedoch nur so lange, wie kein Fehler auftritt oder das Script vorzeitig beendet wird.&lt;br /&gt;
&lt;br /&gt;
Fröhliches Session-Handling Euch allen :)&lt;br /&gt;
&lt;br /&gt;
=== Caching in Typo3 Extensions - Cache Mechanismen ===&lt;br /&gt;
[[Typo3 - Caching in Extensions]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Nützliche Funktionen ===&lt;br /&gt;
Aus Adventskalender 2008 typo3blog &lt;br /&gt;
&lt;br /&gt;
Interessante Funktionen aus der Klasse t3lib_div vor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. t3lib_div::array2json($data)&lt;br /&gt;
Mit dieser Funktion kann man sehr einfach seine Daten in ein JSON Objekt konvertieren. Die Funktion erwartet ein Array mit den Daten, dieses kann beliebig verschachtelt sein. Natürlich gibt es auch noch die PHP native Funktion json_encode, jedoch muss dies von der installierten PHP Installation unterstüzt werden.&lt;br /&gt;
&lt;br /&gt;
2. t3lib_div::convUmlauts($str)&lt;br /&gt;
Eine sehr nützliche Funktion ist convUmlauts, welche die deutschen Umlaute konvertiert, dabei wird aus einem Ä eine Ae oder aus einem ü ein ue. Groß und Klein-Schreibung wird also berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
3. t3lib_div::rmFromList($element, $list)&lt;br /&gt;
Auch diese Funktion ist sehr nützlich. Möchte man aus einer kommaseparierten Liste ein Element entfernen, ist dies mit einem Funktionsaufruf getan. Gerade bei TYPO3 ist diese Funktion sehr hilfreich, wenn man z.B. eine Benutzergruppe eines FE-Users entfernen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions programmieren - Sprachlabels ===&lt;br /&gt;
==== Probleme mit Umlauten ====&lt;br /&gt;
Bei den Sprachdateien locallang.xml etc. kann es Probleme mit Umlauten geben, wenn die Codierung der Datei nicht mit der der Typo3 Installation zusammen passt. Es funktioniert aber automatisch, wenn man die Codierung der xml Datei im Header angibt angibt. Also oben z.B. reinschreiben:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;&lt;br /&gt;
=== Typo3 Extension - Sicherheit ===&lt;br /&gt;
[[Typo3 Extensions programmieren - Sicherheit]]&lt;br /&gt;
&lt;br /&gt;
=== Typo3 Extensions - JavaScript Frameworks nutzen ===&lt;br /&gt;
Nutzen von jquery, extJS und Konsorten in Typo3&lt;br /&gt;
[[Typo3 Extensions - JavaScript Frameworks nutzen]]&lt;br /&gt;
&lt;br /&gt;
== Wichtige Variablen ==&lt;br /&gt;
 $_EXTKEY &lt;br /&gt;
bzw. im Array...&lt;br /&gt;
Enthält den Extension Key.  Immer die Variable benutzen, dann kann man den Code leichte wieder verwenden.&lt;br /&gt;
 $TYPO3_CONF_VARS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie arbeitet eine Extension ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Laden:&amp;#039;&amp;#039;&amp;#039; Extension Manager (EM) ruft &amp;#039;&amp;#039;ext_emconf.php&amp;#039;&amp;#039; (enthält nur das Array: $EM_CONF[$_EXTKEY]) bei allen Extensions auf die in der localconf.php aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aufruf von Backend oder Frontend:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;ext_localconf.php&amp;#039;&amp;#039; wird ausgeführt (oder eine gecachete Kopie) In dieser wird die /typo3conf/localconf.php erweitert.&lt;br /&gt;
Funktion: weitere Klassen includieren (require_once())&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Dateien einer Extension ===&lt;br /&gt;
&lt;br /&gt;
====ext_emconf.php====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Metadaten&amp;#039;&amp;#039;&amp;#039; wie Name, Kategorie, Status einer Extension - muß vorhanden sein sonst wird die Extension nicht geladen. Die Informationen landen in $EM_CONF[$_EXTKEY] = ARRAY&lt;br /&gt;
&lt;br /&gt;
==== ext_localconf.php ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TCA Konfiguration für das Backend&amp;#039;&amp;#039;&amp;#039;. (Werte für das Array $TYPO3_CONF_VARS). Z.B. Namen der zu ladenden Klassen, statische TSFiles etc.&lt;br /&gt;
&lt;br /&gt;
Wird immer geladen wenn ein Aufruf in Frontend oder Backend erfolgt. Kann deshalb dazu benutzt werden wichtige Klassendaten zu laden oder Skripte zu inkludieren.&lt;br /&gt;
&lt;br /&gt;
Optional - wird genutzt wenn Sie gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== ext_tables.php ====&lt;br /&gt;
Erweiterungen für  $&amp;#039;&amp;#039;&amp;#039;TCA&amp;#039;&amp;#039;&amp;#039;(Table Configuration Array). Beschreibungen von Tabellen und Formularen.&lt;br /&gt;
&lt;br /&gt;
Wird außerdem genutzt um den &amp;#039;&amp;#039;&amp;#039;Code von Frontend-Plugins, Modulen oder statischem TypoScript zu laden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Optional - wird genutzt wenn Sie gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== Weitere häufige Dateien ====&lt;br /&gt;
ext_tables.sql - SQL Statements für die &amp;#039;&amp;#039;&amp;#039;Datenbank-Tabellen&amp;#039;&amp;#039;&amp;#039; beim Installieren der Extension.&lt;br /&gt;
&lt;br /&gt;
ext_tables_static+adt.sql - SQL Insert Statements für &amp;#039;&amp;#039;&amp;#039;statische Werte in Tabellen&amp;#039;&amp;#039;&amp;#039; (z.B. PLZ Liste).&lt;br /&gt;
&lt;br /&gt;
ext_conf_template.txt&lt;br /&gt;
&lt;br /&gt;
tca.php - Anpassungen für &amp;#039;&amp;#039;&amp;#039;$TCA,&amp;#039;&amp;#039;&amp;#039; Informationen für die Behandlung von Datenbanktabellen&lt;br /&gt;
&lt;br /&gt;
locallang[...].xml und locallang[...].php - &amp;#039;&amp;#039;&amp;#039;Sprachdateien&amp;#039;&amp;#039;&amp;#039; (Begriffe).&lt;br /&gt;
&lt;br /&gt;
====Typische Unterordner (optional)====&lt;br /&gt;
pi1, pi2 - Enthalten Frontend Plugins&lt;br /&gt;
&lt;br /&gt;
mod1, mod2 - Backend Module&lt;br /&gt;
&lt;br /&gt;
sv1, sv2 - Services&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Globale Variablen ===&lt;br /&gt;
$_EXTKEY - der Extension Key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Formulare im Backend ===&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;$TCA&amp;#039;&amp;#039;&amp;#039; (Table Configuration Array) bestimmt welche Formularfelder verwendet werden.&lt;br /&gt;
Das Array ist in ext_tables.php(Bereiche: ctrl und feinterface s.u.) und tca.php gespeichert&lt;br /&gt;
&lt;br /&gt;
* Jeder Eintrag im $TCA ist an eine Datenbanktabelle geknüpft&lt;br /&gt;
* Der erste Index ist der Tabellenname.&lt;br /&gt;
* Im zweiten Index gibt es 6 Bereiche: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ctrl -&amp;gt; Informationen zur Tabelle&lt;br /&gt;
 interface -&amp;gt; Konfiguration für die Auflistung und Darstellung im Backend&lt;br /&gt;
 feInterface -&amp;gt; Eigenschaften für das Frontend Editing&lt;br /&gt;
 columns -&amp;gt; Informationen zu den Feldtypen der Tabelle und der Verarbeitung der Daten (zweiter Index ist hier der Spaltenname)&lt;br /&gt;
 types -&amp;gt; legt fest welche der in columns definierten Spalten dargestellt werden und in welcher Reihenfolge, &lt;br /&gt;
          außerdem Zusatzinfo wie alternative Feldbezeichnung, Palettennummer, style codes...&lt;br /&gt;
 palettes -&amp;gt; Zum Zusammenfassen von mehreren Eingabefeldern, Zusammenstellungen wiederverwenden, Hilfsfelder definieren&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Daten bearbeiten mit TCE und TCEforms ===&lt;br /&gt;
Die im $TCA definierten Daten müssen in irgend einer Form bearbeitet werden. Ein umfangreiches Modul dazu befindet sich  in der Extension CMS (typo3/sysext/cms/layout/db_layout.php. DDas Modul greift auf die &amp;#039;&amp;#039;&amp;#039;Typo3 Core Engine (TCE)&amp;#039;&amp;#039;&amp;#039; zurück, die zum Verarbeiten und Speichern von Daten dient. Die &amp;#039;&amp;#039;&amp;#039;Formulare werden mit der Klasse TCEforms&amp;#039;&amp;#039;&amp;#039; erzeugt. Bearbeitet wird hierbei im Backend.&lt;br /&gt;
&lt;br /&gt;
Immer dann, wenn man die &amp;#039;&amp;#039;&amp;#039;im $TCA eingetragenen Tabellen über Eingabemasken manipulieren&amp;#039;&amp;#039;&amp;#039; will ist des sinnvoll die TCE zu nutzen.&lt;br /&gt;
&lt;br /&gt;
 t3lib_TCEmain -&amp;gt; t3lib/class.t3lib_tce-main.php&lt;br /&gt;
 t3lib_TCEforms -&amp;gt; TCEforms&lt;br /&gt;
&lt;br /&gt;
==== Einsatz in Extensions ====&lt;br /&gt;
Instanz von t3lib_TCEmain erzeugen:&lt;br /&gt;
 require_once(PATH_t3lib.&amp;quot;class.t3lib_tcemain.php&amp;quot;);&lt;br /&gt;
 $tce=t3lib_div::makeInstance(&amp;#039;t3lib_TCEmain&amp;#039;);&lt;br /&gt;
Arrays für Daten und Kommandos erzeugen:&lt;br /&gt;
 $data[tabelle][uid][feld] = wert&lt;br /&gt;
um neue Daten zu schreiben bevor man eine uid hat belegt man uid mit NEW und einem Zufallsstring z.B. NEWo1amh&lt;br /&gt;
 $cmd[tabelle][uid][befehl] = wert&lt;br /&gt;
dabei stehen verschiedene Befehle zur Verfügung:&lt;br /&gt;
 copy, move, delete, localize, version, new&lt;br /&gt;
Die beiden Arrays werden dann mittels &lt;br /&gt;
 $tce-&amp;gt;start($data,$cmd) &lt;br /&gt;
an die TCE übergeben und von &lt;br /&gt;
$tce-&amp;gt;process_cmdmap() &lt;br /&gt;
abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Wo finde ich welche Funktionen - Bibliotheken von TYPO3 einbinden und nutzen ==&lt;br /&gt;
Oft sucht man nach benötigten Funktionen. Z.B. wenn man im Backend oder über das alternative Rendering (eid) Core Funktionen braucht. &lt;br /&gt;
Hier mal ein paar Ansätze zum gucken. Dies ist kein zusammenhängender Code nur ein paar Schnipsel um die Hirnwindungen anzuregen &lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require_once(PATH_t3lib.&amp;#039;class.t3lib_page.php&amp;#039;);&lt;br /&gt;
require_once(PATH_tslib.&amp;quot;class.tslib_content.php&amp;quot;);&lt;br /&gt;
require_once(PATH_t3lib.&amp;quot;class.t3lib_stdgraphic.php&amp;quot;);&lt;br /&gt;
require_once(PATH_tslib.&amp;quot;class.tslib_gifbuilder.php&amp;quot;); &lt;br /&gt;
require_once (PATH_t3lib . &amp;#039;class.t3lib_htmlmail.php&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$pid = intval(t3lib_div::_GET(&amp;#039;pid&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
// create object instances:&lt;br /&gt;
&lt;br /&gt;
//$temp_TSFEclassName = t3lib_div::makeInstanceClassName(&amp;#039;tslib_fe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$TSFE = new $temp_TSFEclassName($TYPO3_CONF_VARS, $page, 0, true);&lt;br /&gt;
$TSFE-&amp;gt;sys_page = t3lib_div::makeInstance(&amp;#039;t3lib_pageSelect&amp;#039;);&lt;br /&gt;
$TSFE-&amp;gt;tmpl = t3lib_div::makeInstance(&amp;#039;t3lib_tstemplate&amp;#039;);&lt;br /&gt;
$TSFE-&amp;gt;tmpl-&amp;gt;init();&lt;br /&gt;
&lt;br /&gt;
// fetch rootline and extract ts setup:&lt;br /&gt;
$TSFE-&amp;gt;rootLine = $TSFE-&amp;gt;sys_page-&amp;gt;getRootLine(intval($pid));&lt;br /&gt;
$TSFE-&amp;gt;getConfigArray();&lt;br /&gt;
&lt;br /&gt;
// return ts setup array:&lt;br /&gt;
$setup = $TSFE-&amp;gt;tmpl-&amp;gt;setup;&lt;br /&gt;
$conf = $setup[&amp;#039;plugin.&amp;#039;][&amp;#039;tx_rgcarousel_pi1.&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
$myCObj = new tslib_cObj();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionen in Klassendateien auslagern ==&lt;br /&gt;
Oft ist es übersichtlicher Funktionen in eigene Dateien auszulagern. Im tt_news Frontend-Plugin wird das z.B. so gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_catmenu.php&amp;#039;);&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_helpers.php&amp;#039;);&lt;br /&gt;
require_once (t3lib_extMgm::extPath(&amp;#039;tt_news&amp;#039;) . &amp;#039;lib/class.tx_ttnews_cache.php&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Klassendateien liegen also im Ordner lib.&lt;br /&gt;
&lt;br /&gt;
Die Dateien enthalten gleichnamige Klassen. Das Objekt dazu wird dann z.B. so erzeugt:&lt;br /&gt;
 $catTreeObj = t3lib_div::makeInstance(&amp;#039;tx_ttnews_catmenu&amp;#039;);&lt;br /&gt;
Typo3 hat also eine eigene Funktion um die Instanz zu erzeugen. Man muß also nicht mit new arbeiten. Der Vorteil ist mir noch nicht klar. Evtl. wird hier noch etwas anderes ausgeführt etwa um die Klasse zu registrieren o.ä.&lt;br /&gt;
&lt;br /&gt;
Drauf zugegriffen wird dann ganz normal z.B.:&lt;br /&gt;
 $catTreeObj-&amp;gt;init($this);&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich eine eigene Extension debuggen? ==&lt;br /&gt;
=== Hilfreiche Extensions zur Entwicklung von Extensions ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;devlog&amp;#039;&amp;#039;&amp;#039; -&amp;gt; schreibt log Einträge in eine Datenbanktabelle. Dazu ruft man an in seiner Extension die Funktion TODO auf und übergibt die Werte die man loggen will.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Extension Development Evaluator  (extdeveval) &amp;#039;&amp;#039;&amp;#039; -&amp;gt; Referenzen aufrufen, Autmatisch Funktionsinfos schreiben u.v.m.&lt;br /&gt;
	&lt;br /&gt;
=== permalink ===&lt;br /&gt;
Wenn man eine eigene Extension schreibt benutzt man zum größten Teil Array, und um den Überblick zu behalten was nach den ganzen schritten in einem Array noch so drin steht hat man die möglichkeit mit einer Funktion das Array schön und sauber in einer tabelle anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
t3lib_div::debug($data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
je nach devIPMask Einstellungen ist auch nur&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
 debug();&lt;br /&gt;
&lt;br /&gt;
nützlich, vor allem wenn ein Kundenprojekt Online ist einfach im Installtool und devIpMask deine IP eingeben und dann mit debug(); arbeiten, so kannst nur du den debug sehen und nicht irgendwelche User die grade auf der Site sind.&lt;br /&gt;
&lt;br /&gt;
Kleiner Zusatz Tip:&lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch gleichzeitig mehrere Debugs ausgeben und verliert den überblick welcher debug welcher ist... Beispiel Ihr lasst euch ein Array vor einer funktion debugen und anschliessend...&lt;br /&gt;
&lt;br /&gt;
da habt ihr dann die möglichkeit euerem Debug einen Namen zu geben..&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
PHP-Code:&lt;br /&gt;
 $data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22);&lt;br /&gt;
 t3lib_div::debug(,&amp;#039;Array vorher&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
 $data[&amp;#039;Name&amp;#039;] = &amp;#039;T.uX&amp;#039;;&lt;br /&gt;
 $data[&amp;#039;Alter&amp;#039;] = 32;&lt;br /&gt;
&lt;br /&gt;
 t3lib_div::debug(,&amp;#039;Array nachher&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Auch bei der Verwendung der integrierten DB-Abstraktionsschicht können eine Reihe von Fehlern auftreten, die teilweise nur sehr magere Fehlermeldungen produzieren. Um eine etwas explizitere Fehlerausgabe zu erzwingen sollte man folgende Zeile in seine Extension integrieren*:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
 $GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;debugOutput = true;&lt;br /&gt;
So wird z.B. das SQL-Stement Ausgegeben, das zu einem Fehler geführt hat.&lt;br /&gt;
&lt;br /&gt;
== Datenbankabfrage in Extensions ==&lt;br /&gt;
[[TYPO3 - Datenbankabfragen in Extensions]]&lt;br /&gt;
&lt;br /&gt;
== Struktur einer Extension ==&lt;br /&gt;
===ext_emconf.php===&lt;br /&gt;
&lt;br /&gt;
Informationen und Metadaten zur Extension. Etwa die Infos die im Kickstarter unter General Info stehen.&lt;br /&gt;
&lt;br /&gt;
* Root-Verzeichnis&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_localconf.php&amp;#039;&amp;#039;&amp;#039; Enthält &amp;#039;&amp;#039;&amp;#039;Konfigurationsdaten&amp;#039;&amp;#039;&amp;#039; ($TYPO3_CONF_VARS) für das Backend und Frontend. Hier kann über die Extension API auch &amp;#039;&amp;#039;&amp;#039;TypoScript&amp;#039;&amp;#039;&amp;#039; eingebunden werden. Hier können auch Klassendateien aufgerufen werden (require_once() ) die bei jedem Aufruf zur Verfügung stehen sollen.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables.php&amp;#039;&amp;#039;&amp;#039; Konfiguration von &amp;#039;&amp;#039;&amp;#039;Datenbanktabellen&amp;#039;&amp;#039;&amp;#039;. Plugins und Module über die Extension API einbinden. (Alles über Kickstarter)&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables.sql&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;SQL-Daten&amp;#039;&amp;#039;&amp;#039; für die Tabellendefinition. Die Auswertung erfolgt über den Extension Manager und das Install-Tool.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_tables_static+adt.sql&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;SQL-Tabellendefinition&amp;#039;&amp;#039;&amp;#039; inkl. Daten. Z.B. für statische Daten (Länderinfos etc.)Die Tabellen müssen zusätzlich in ext_tables.sql definiert sein.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_typoscript_*.txt&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Globaler TypoScript-Code&amp;#039;&amp;#039;&amp;#039;. Steht nicht üver Template-Datensätze zur Auswahl (siehe /static)&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;ext_conf_template.txt&amp;#039;&amp;#039;&amp;#039; Hier werden &amp;#039;&amp;#039;&amp;#039;Optionen zur Konfiguration&amp;#039;&amp;#039;&amp;#039; angelegt, die der Benutzer im Extensionmanager einstellen kann.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;*icon*.gif&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Symbol-Dateien&amp;#039;&amp;#039;&amp;#039; für Extension,DB-Tabellen,Plugins, Module...&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;locallang*.php&amp;#039;&amp;#039;&amp;#039; Texte für die &amp;#039;&amp;#039;&amp;#039;Lokalisierung&amp;#039;&amp;#039;&amp;#039; in verschiedenen Sprachen&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;class.ext_update.php&amp;#039;&amp;#039;&amp;#039; Funktionen für ein &amp;#039;&amp;#039;&amp;#039;Update der Extension&amp;#039;&amp;#039;&amp;#039; (Beispiel siehe newloginbox).&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;pi1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für &amp;#039;&amp;#039;&amp;#039;Skripte und Daten&amp;#039;&amp;#039;&amp;#039; des Plugin&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;class*.php&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;PHP-Klassen&amp;#039;&amp;#039;&amp;#039; z.B. für Plugins oder Submodule&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;cm1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für Dateien die das &amp;#039;&amp;#039;&amp;#039;Kontext-Menü&amp;#039;&amp;#039;&amp;#039; betreffen&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;mod1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für ein Modul.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;conf.php&amp;#039;&amp;#039;&amp;#039; Konfigurationsdatei für ein &amp;#039;&amp;#039;&amp;#039;Modul&amp;#039;&amp;#039;&amp;#039; zum einbinden ins Backend.&lt;br /&gt;
**&amp;#039;&amp;#039;&amp;#039;index.php&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Hauptscript eines Moduls&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;modfunc1/&amp;#039;&amp;#039;&amp;#039; Skripte und Daten für &amp;#039;&amp;#039;&amp;#039;Submodul-Funktionen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;static/&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;TypoScript-Template&amp;#039;&amp;#039;&amp;#039;-Dateien. Diese werden über die Extension-API eingebunden und stehen dann in Template-Datensätzen, ähnlich den Standard Templates zur Auswahl.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sv1/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;res/&amp;#039;&amp;#039;&amp;#039; Verzeichnis für beliebige &amp;#039;recourcen&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc/&amp;#039;&amp;#039;&amp;#039; Verzeichnis der &amp;#039;&amp;#039;&amp;#039;Dokumentation&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Wo werden Extensions installiert ? ==&lt;br /&gt;
===typo3/sysext/ (System)===&lt;br /&gt;
System Extensions wie cms und lang. Hier können keine Extensions mit dem Extension Manager installiert werden.&lt;br /&gt;
===typo3/ext/ - globale Extensions (Global) ===&lt;br /&gt;
Z.B. diese die von Typo3 mitgeliefert werden. Mit der Option allowGlobalInstall kann man die Installation in dieses Verzeichnis erlauben. Das ist dann nicht sinnvoll wenn sich mehrere Typo3 WEbsites eine Installation teilen, weil es hier zu Versionskonflikten kommen kann.&lt;br /&gt;
===typo3conf/ext - lokale Extensions (Local)===&lt;br /&gt;
Hier werden normalerweise alle Extensions installiert. Die Lokale Installation hat immer Vorang vor einer globalen.&lt;br /&gt;
&lt;br /&gt;
== Typolinks richtig in Extensions einsetzen ==&lt;br /&gt;
&lt;br /&gt;
In diesem kurzem Tutorial möchte ich zeigen, wie man Typolinks in eigenen Erweiterungen erstellt, die das&lt;br /&gt;
Feature &amp;#039;Simulate Static Documents&amp;#039; unterstützen und eine Ausgabe erstellen, die von Typo3 gecached wird&lt;br /&gt;
und so auch mit der Indexed search verwendet werden können. Diese Informationen wurden aus anderen&lt;br /&gt;
Erweiterungen zusammengetragen, speziell aus der Erweiterung tt_board.&lt;br /&gt;
Typoscript&lt;br /&gt;
Zuerst erstelle in der Datei &amp;#039;ext_typoscript_setup.txt&amp;#039; eine Eigenschaft, die deiner Erweiterung mitteilt, ob&lt;br /&gt;
caching genutzt werden soll oder nicht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_myextension_pi1 {&lt;br /&gt;
allowCaching = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das später auf 0 gesetzt wird, werden diese Seiten nicht mehr gecached.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vorbereitung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Bereite in der main() Funktion den Typolink vor und konfiguriere das caching:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class tx_myextension_pi1 extends tslib_pibase {&lt;br /&gt;
...&lt;br /&gt;
var $allowCaching = &amp;quot;&amp;quot;;&lt;br /&gt;
function main($content,$conf) {&lt;br /&gt;
$this-&amp;gt;conf=$conf;&lt;br /&gt;
...&lt;br /&gt;
// Preconfigure the typolink&lt;br /&gt;
$this-&amp;gt;local_cObj = t3lib_div::makeInstance(&amp;quot;tslib_cObj&amp;quot;);&lt;br /&gt;
$this-&amp;gt;local_cObj-&amp;gt;setCurrentVal($GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;id);&lt;br /&gt;
$this-&amp;gt;typolink_conf = $this-&amp;gt;conf[&amp;quot;typolink.&amp;quot;];&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;parameter.&amp;quot;][&amp;quot;current&amp;quot;] = 1;&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;additionalParams&amp;quot;] =&lt;br /&gt;
$this-&amp;gt;cObj-&amp;gt;stdWrap($this-&amp;gt;typolink_conf[&amp;quot;additionalParams&amp;quot;],&lt;br /&gt;
$this-&amp;gt;typolink_conf[&amp;quot;additionalParams.&amp;quot;]);&lt;br /&gt;
unset($this-&amp;gt;typolink_conf[&amp;quot;additionalParams.&amp;quot;]);&lt;br /&gt;
// Configure caching&lt;br /&gt;
$this-&amp;gt;allowCaching = $this-&amp;gt;conf[&amp;quot;allowCaching&amp;quot;]?1:0;&lt;br /&gt;
if (!$this-&amp;gt;allowCaching) {&lt;br /&gt;
$GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;set_no_cache();&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
Links erstellen&lt;br /&gt;
Um nun Links in der Erweiterung zu erstellen, benutze das folgende Code Fragment:&lt;br /&gt;
$temp_conf = $this-&amp;gt;typolink_conf;&lt;br /&gt;
$temp_conf[&amp;quot;additionalParams&amp;quot;] .= &amp;quot;&amp;amp;tx_myextension_pi1[key]=value&amp;quot;;&lt;br /&gt;
$temp_conf[&amp;quot;useCacheHash&amp;quot;] = $this-&amp;gt;allowCaching;&lt;br /&gt;
$temp_conf[&amp;quot;no_cache&amp;quot;] = !$this-&amp;gt;allowCaching;&lt;br /&gt;
$the_link = $this-&amp;gt;local_cObj-&amp;gt;typolink(&amp;quot;Linktext&amp;quot;, $temp_conf);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach kann man &amp;#039;$the_link&amp;#039; zu der Ausgabe hinzufügen. Das &amp;#039;$temp_conf&amp;#039; Array kann man mit allen&lt;br /&gt;
Eigenschaften des typolink Objektes erweitern.&lt;br /&gt;
&lt;br /&gt;
Tutorial by typo3.hachmeister.org&lt;br /&gt;
Von:fruit-lab.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datei Uploads in Backend Extensions ==&lt;br /&gt;
Feld im Kickstarter anlegen. in der tca.php kannst du den uploadfolder festlegen.&lt;br /&gt;
&lt;br /&gt;
Komplizierter wirds in folgendem Fall (aus typo3.net 12-2007)&lt;br /&gt;
&lt;br /&gt;
 stimmt schon, dass man da den ordner ändern kann, aber was wenn ich nicht alle dateien in einen ordner speichern will?&lt;br /&gt;
ich brauche 2 ordner. einen für normale downloads und in den anderen würden die dateien reinkommen, die kostenpflichtig downzuloaden sind. diesen ordner muss ich also per htaccess schützen. darum wärs nötig, dass der upload-ordner für den späteren redakteur frei wählbar, oder zumindest 2 ordner auswählbar sind.&lt;br /&gt;
&lt;br /&gt;
irgendwelche ideen?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
alles kein Problem.&lt;br /&gt;
&lt;br /&gt;
Man kann in der ext_emconf.php unter createDirs die benötigten Verzeichnisse angeben.&lt;br /&gt;
Für Fileupload gibts auch einige Typofunktionen die man nutzen kann, so helfen einem folgende Klassen weiter:&lt;br /&gt;
t3lib_basicFileFunctions&lt;br /&gt;
t3lib_extFileFunctions&lt;br /&gt;
&lt;br /&gt;
== Debug Methode ==&lt;br /&gt;
Typo3 | Debug Methode :: Hilfe bei der Programmierung&lt;br /&gt;
&lt;br /&gt;
Wenn man eine eigene Extension schreibt benutzt man zum größten Teil Array, und um den Überblick zu&lt;br /&gt;
behalten was nach den ganzen schritten in einem Array noch so drin steht hat man die möglichkeit mit einer Funktion das Array schön und sauber in einer tabelle anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
echo t3lib_div::debug($data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TS_debug01.gif]]&lt;br /&gt;
&lt;br /&gt;
je nach devIPMask Einstellungen ist auch nur&lt;br /&gt;
 debug($sonstwas);&lt;br /&gt;
nützlich, vor allem wenn ein Kundenprojekt Online isteinfach im Installtool und devIpMask deine IP eingeben und dann mit debug($sonstwas); arbeiten, so kannst nur du den debug sehen und nicht irgendwelche User die grade auf der Site sind.&lt;br /&gt;
&lt;br /&gt;
Kleiner Zusatz Tip:&lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch gleichzeitig mehrere Debugs ausgeben und verliert den überblick welcher debug welcher ist...&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Ihr lasst euch ein Array vor einer funktion debugen und anschliessend...&lt;br /&gt;
da habt ihr dann die möglichkeit euerem Debug einen Namen zu geben..&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$data = array(&amp;quot;Name&amp;quot; =&amp;gt; &amp;quot;Peter KeineAhnung&amp;quot;, &amp;quot;Alter&amp;quot; =&amp;gt; 22, &amp;quot;Wohnort&amp;quot; =&amp;gt; &amp;quot;Ratingen&amp;quot;);&lt;br /&gt;
echo t3lib_div::debug($data,&amp;#039;Array vorher&amp;#039;);&lt;br /&gt;
$data[&amp;#039;Name&amp;#039;] = &amp;#039;T.uX&amp;#039;;&lt;br /&gt;
$data[&amp;#039;Alter&amp;#039;] = 32;&lt;br /&gt;
echo t3lib_div::debug($data,&amp;#039;Array nachher&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TS_debug02.gif]]&lt;br /&gt;
&lt;br /&gt;
Hinweis:&lt;br /&gt;
läst du dir eine Variable im debug ausgeben erscheint [b]|debug|[/b]. das funzt nur mit Arrays ;-)&lt;br /&gt;
Auch bei der Verwendung der integrierten DB-Abstrktionsschicht können eine Reihe von Fehlern auftreten,&lt;br /&gt;
die teilweise nur sehr magere Fehlermeldungen produzieren. Um eine etwas explizitere Fehlerausgabe zu&lt;br /&gt;
erzwingen sollte man folgende Zeile in seine Extension integrieren*:&lt;br /&gt;
$GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;debugOutput = true;&lt;br /&gt;
&lt;br /&gt;
So wird z.B. das SQL-Stement Ausgegeben, das zu einem Fehler geführt hat.&lt;br /&gt;
Tutorial by typo3.kj187.de&lt;br /&gt;
&lt;br /&gt;
== PHP-Skripte einbinden ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mit PHP_SCRIPT ===&lt;br /&gt;
&lt;br /&gt;
Im Typo Script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##############################&lt;br /&gt;
### temporäres Test Script ###&lt;br /&gt;
##############################&lt;br /&gt;
&lt;br /&gt;
temp.phpScript = PHP_SCRIPT&lt;br /&gt;
temp.phpScript {&lt;br /&gt;
   file = demo/test.inc.php&lt;br /&gt;
   myVerySpecialOwnParameter = Hallo Welt&lt;br /&gt;
   myParamArray {&lt;br /&gt;
      a = 2&lt;br /&gt;
      b = 5&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im Skript text.inc.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Use the debug-function to view the config&lt;br /&gt;
// array $conf given by TypoScript:&lt;br /&gt;
debug( $conf );&lt;br /&gt;
&lt;br /&gt;
$contentArr[] = &amp;quot;Test&amp;quot;;&lt;br /&gt;
$contentArr[] = $conf[&amp;#039;file&amp;#039;];&lt;br /&gt;
$contentArr[] = $conf[&amp;#039;myVerySpecialOwnParameter&amp;#039;];&lt;br /&gt;
$contentArr[] = implode( $conf[&amp;#039;myParamArray.&amp;#039;], &amp;#039;, &amp;#039; );&lt;br /&gt;
&lt;br /&gt;
// Put all your output to $content,&lt;br /&gt;
// that TYPO3 will display for you:&lt;br /&gt;
$content = implode( $contentArr, &amp;#039;&amp;lt; br /&amp;gt;&amp;#039; );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mit PHP_SCRIPT_EXT ===&lt;br /&gt;
Typo3 | Externe PHP Scripte einbinden&lt;br /&gt;
&lt;br /&gt;
Haben Sie ihr Projekt auf Typo3 umgestellt und wollen dennoch ihre eigenen PHP-Scripte verwenden? Dann machen Sie folgendes.&lt;br /&gt;
&lt;br /&gt;
Schreiben Sie in das SETUP Feld des Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tt_content.script = CASE&lt;br /&gt;
tt_content.script {&lt;br /&gt;
key.field = select_key&lt;br /&gt;
test = PHP_SCRIPT_EXT&lt;br /&gt;
test.file = fileadmin/dein_script.php&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um das Script jetzt als Contentelement in die Seite einzubinden, legen Sie einen neuen Seiteninhalt an. Wechseln Sie von Typ = Text auf Typ = Skript. In das CODE Feld müssen Sie jetzt nur noch test eintragen und sie sind fertig. &lt;br /&gt;
&lt;br /&gt;
Dies ist die einfachste Methode. Die Ausgabe des Scripts wird aber nicht in den Cache aufgenommen! Diese Funktion wird leider nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Tutorial by typo3.kj187.de&lt;br /&gt;
&lt;br /&gt;
Anmerkung Steff: Für die Cache Funktion kann man z.B. eine Einfache Extension basteln.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
===Einträge aus Bildausrichtungen im Backend entfernen===&lt;br /&gt;
aus cron_cssstyledimgtext&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if (!defined (&amp;#039;TYPO3_MODE&amp;#039;))     die (&amp;#039;Access denied.&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
t3lib_extMgm::addPItoST43($_EXTKEY,&amp;#039;pi1/class.tx_croncssstyledimgtext_pi1.php&amp;#039;,&amp;#039;_pi1&amp;#039;,&amp;#039;&amp;#039;,1);&lt;br /&gt;
&lt;br /&gt;
$_EXTCONF = unserialize($_EXTCONF);&lt;br /&gt;
if ($_EXTCONF[&amp;#039;addPageTS&amp;#039;])	{&lt;br /&gt;
	t3lib_extMgm::addPageTSConfig(&amp;#039;&lt;br /&gt;
TCEFORM.tt_content.imageorient.types.image.removeItems = 8,9,10,17,18,25,26&lt;br /&gt;
&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;FE&amp;#039;][&amp;#039;XCLASS&amp;#039;][&amp;#039;tslib/class.tslib_content.php&amp;#039;]=t3lib_extMgm::extPath($_EXTKEY).&amp;#039;class.ux_tslib_content.php&amp;#039;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bilder in eigener Extension rendern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel benutzte Variablen:&lt;br /&gt;
 $BildAdresse&lt;br /&gt;
 $ParameterFuerImgTag&lt;br /&gt;
 $Alttext&lt;br /&gt;
&lt;br /&gt;
In PHP-Datei der Extension:&lt;br /&gt;
&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;file&amp;quot;]=&amp;quot;uploads/pics/&amp;quot;.$BildAdresse;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;params&amp;quot;]=$ParameterFuerImgTag;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;altText&amp;quot;]=$Alttext;&lt;br /&gt;
 $Bild=$this-&amp;gt;cObj-&amp;gt;IMAGE($this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;]);&lt;br /&gt;
 $Content.=$Bild;&lt;br /&gt;
&lt;br /&gt;
In Typoscript Setup&lt;br /&gt;
&lt;br /&gt;
 plugin.tx_hoTest_pi1 {     //hier Plugin-Name&lt;br /&gt;
 imageArtikel{&lt;br /&gt;
     file.maxW = {$ho_Test.BildWidthNews}  &lt;br /&gt;
     imageLinkWrap = 1&lt;br /&gt;
     imageLinkWrap {&lt;br /&gt;
       enable = 1&lt;br /&gt;
       bodyTag = &amp;lt;BODY bgColor=white&amp;gt;&lt;br /&gt;
       wrap = |&lt;br /&gt;
       width = 400m&lt;br /&gt;
       height = 400&lt;br /&gt;
       JSwindow = 1&lt;br /&gt;
       JSwindow.newWindow = 1&lt;br /&gt;
       JSwindow.expand = 17,20&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der Wert {$ho_Test.BildWidthNews} kann aus Constants übernommen werden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch&lt;br /&gt;
Konstanten von Constants im Setup verwenden&lt;br /&gt;
und&lt;br /&gt;
Konstanten für Constant-Editor bereitstellen&lt;br /&gt;
&lt;br /&gt;
(aus www.easy-office4you.de/ 10.1.2006)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Spalten der Seiten umbenennen ===&lt;br /&gt;
&lt;br /&gt;
Um die Spalten der Seite im Backend beliebig umzubenennen und/oder zusätzliche eigene Spalten zu verwenden, muß die Extension zed_more_columns installiert werden und dann in der Datei ext_tables.php die Spalten-Namen eingeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 $TCA[&amp;quot;tt_content&amp;quot;][&amp;quot;columns&amp;quot;][&amp;quot;colPos&amp;quot;][&amp;quot;config&amp;quot;][&amp;quot;items&amp;quot;] = array (&lt;br /&gt;
 &amp;quot;0&amp;quot; =&amp;gt; array (&amp;quot;Mitte||Mitte||||||||&amp;quot;,&amp;quot;0&amp;quot;),&lt;br /&gt;
 &amp;quot;1&amp;quot; =&amp;gt; array (&amp;quot;Links||Links||||||||&amp;quot;,&amp;quot;1&amp;quot;),&lt;br /&gt;
 &amp;quot;2&amp;quot; =&amp;gt; array (&amp;quot;Rechts||Rechts||||||||&amp;quot;,&amp;quot;2&amp;quot;),&lt;br /&gt;
 &amp;quot;3&amp;quot; =&amp;gt; array (&amp;quot;Teaser||Teaser||||||||&amp;quot;,&amp;quot;3&amp;quot;),&lt;br /&gt;
 &amp;quot;4&amp;quot; =&amp;gt; array (&amp;quot;Fusszeile||Fusszeile||||||||&amp;quot;,&amp;quot;4&amp;quot;)&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== Bei Extension dafür sorgen, daß im Backend kein Sortierungs-Button entsteht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Datei ext_tables.php der Extension folgende Zeile ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;sortby&amp;quot; =&amp;gt; &amp;quot;name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
ändern in&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;default_sortby&amp;quot; =&amp;gt; &amp;quot;ORDER BY name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Anstatt &amp;quot;name&amp;quot; kann natürlich auch ein anderes Suchkriterium verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Ausgaben im HTML-Header in Extensions programmieren ==&lt;br /&gt;
Manchmal möchte man bestimmte Angaben in den Header schreiben, um zum Beispiel ein JavaScript einzubinden o.ä.&lt;br /&gt;
&lt;br /&gt;
Man könnte im statischen TypoScript für das Objekt page etwas hernehmen. Das funktioniert aber nur wenn das PAGE Objekt auch wirklich page heißt.&lt;br /&gt;
&lt;br /&gt;
Also besser mit einer Typo3 Eigenen Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel - JavaScript einbinden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function includeJavaScript() {&lt;br /&gt;
  $js .= &amp;#039;&amp;lt;script src=&amp;quot;&amp;#039;.t3lib_extMgm::siteRelPath($this-&amp;gt;extKey).dirname($this-&amp;gt;scriptRelPath).&amp;#039;/JS-Verzeichnis/js-file.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;!-- //--&amp;gt;&amp;lt;/script&amp;gt;&amp;#039;;&lt;br /&gt;
  $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;additionalHeaderData[$this-&amp;gt;extKey] = $js;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Aufruf der Funktion:&lt;br /&gt;
$content=$this-&amp;gt;includeJavaScript(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable $this-&amp;gt;extKey wird normalerweise immer in der Klassendefinition der Extensiongesetzt und enthält den Namen der Extension (z.B. meineextension)&lt;br /&gt;
&lt;br /&gt;
Für $this-&amp;gt;scriptRelPath gilt das gleiche. Hier steht der Pfad ab dem Extension Ordner (z.B. pi1/class.tx_meineExtension_pi1.php)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachige Extensions ==&lt;br /&gt;
Seit der Version 4 hat sich die Vorgehensweise bei der Lokalisierung geändert. Um zu verstehen wie die Lokalisierung von Backend, Frontend etc. funktioniert gibt es hier eine kleine Übersicht:&lt;br /&gt;
[[Sprachverwaltung und Lokalisierung in Typo3]]&lt;br /&gt;
&lt;br /&gt;
== $GLOBALS[&amp;#039;TSFE&amp;#039;] ==&lt;br /&gt;
&lt;br /&gt;
TSFE ist ein Abbild der Klasse tslib_fe, die kannst Du auch untersuchen.&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_debuggen&amp;diff=20328</id>
		<title>TYPO3 - Extensions debuggen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Extensions_debuggen&amp;diff=20328"/>
		<updated>2014-07-17T10:25:12Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: Die Seite wurde neu angelegt: „Möglichkeiten um in TYPO3 Debuggen zu können. Von errorHandler bis sqlDebug. Mit ein paar Handgriffen kann man TYPO3 dazu überreden, Debuginfos auszuwerfen. Um…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Möglichkeiten um in TYPO3 Debuggen zu können. Von errorHandler bis sqlDebug. Mit ein paar Handgriffen kann man TYPO3 dazu überreden, Debuginfos auszuwerfen.&lt;br /&gt;
Um von TYPO3 Debuginfos zu erhalten, gibt es sicherlich zig Möglichkeiten. Ich habe hier versucht, einige zusammen zu schreiben. Da ich noch nicht soviel Erfahrung in diesem Gebiet habe würde ich mich über Feedback freuen, womit man TYPO3 noch debuggen könnte - oder wie es sogar einfacher gehen könnte.&lt;br /&gt;
&lt;br /&gt;
Bei PHP-Fehlern sollte devIPmask die erste Anlaufstelle sein. Wenn der anfragende Host sich in dem Adressbereich befindet, wird statt der bloßen Fehlermeldung ein Stack-Trace ausgegeben und so die Fehlerursache leichter herausfinden lässt. Danke an Steffen Gebbert für diesen Tipp!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Add temporary in localconf.php for debug&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Konfiguriert ob PHP Errors ausgegeben werden sollen&lt;br /&gt;
 *   0 Do not display any PHP error messages. Overrides the value of &amp;quot;exceptionalErrors&amp;quot; and sets it to 0 (= no errors are turned into exceptions), the configured &amp;quot;productionExceptionHandler&amp;quot; is used as exception handler&lt;br /&gt;
 *   1 Display error messages with the registered errorhandler. The configured &amp;quot;debugExceptionHandler&amp;quot; is used as exception handler&lt;br /&gt;
 *   2 Display errors only if client matches [SYS][devIPmask]. If devIPmask matches the users IP address the configured &amp;quot;debugExceptionHandler&amp;quot; is used for exceptions, if not &amp;quot;productionExceptionHandler&amp;quot; will be used&lt;br /&gt;
 *  -1 Default setting. With this option, you can override the PHP setting &amp;quot;display_errors&amp;quot;. If devIPmask matches the users IP address the configured &amp;quot;debugExceptionHandler&amp;quot; is used for exceptions, if not &amp;quot;productionExceptionHandler&amp;quot; will be used.&lt;br /&gt;
*/ &lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;displayErrors&amp;#039;] = &amp;#039;1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Definieren einer IP oder eines IP-Bereiches welche die Debugausgabe erhalten soll&lt;br /&gt;
 * um Debuginfos und Errors vor Livebesuchern zu verbergen&lt;br /&gt;
 * Wildcards für Oktetten sind erlaubt&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;devIPmask&amp;#039;] = &amp;#039;*&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Konfiguration des Errorhandlers&lt;br /&gt;
 * Hier mit einer brauchbaren Konfiguration&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;errorHandler&amp;#039;] = &amp;#039;t3lib_error_ErrorHandler&amp;#039;;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;errorHandlerErrors&amp;#039;] = E_ALL ^ E_NOTICE;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;exceptionalErrors&amp;#039;] = E_ALL ^ E_NOTICE ^ E_WARNING ^ E_USER_ERROR ^ E_USER_NOTICE ^ E_USER_WARNING;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;debugExceptionHandler&amp;#039;] = &amp;#039;t3lib_error_DebugExceptionHandler&amp;#039;;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;productionExceptionHandler&amp;#039;] = &amp;#039;t3lib_error_DebugExceptionHandler&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Konfiguration der Log-Methoden [systemLog]&lt;br /&gt;
 * file,&amp;lt;abs-path-to-file&amp;gt;[,&amp;lt;level&amp;gt;]   logs to a file&lt;br /&gt;
 * mail,&amp;lt;to&amp;gt;[/&amp;lt;from&amp;gt;][,&amp;lt;level&amp;gt;]        sends the log entries via mail&lt;br /&gt;
 * syslog,&amp;lt;facility&amp;gt;,[,&amp;lt;level&amp;gt;]        uses the operating system&amp;#039;s log. Facility may be one of LOCAL0..LOCAL7, USER (on Windows USER is the only valid type).&lt;br /&gt;
 * error_log[,,&amp;lt;level&amp;gt;]                uses the PHP error log&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;systemLog&amp;#039;] = &amp;#039;error_log&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Konfiguration des Verbosity-Levels von [systemLog]&lt;br /&gt;
 * 0 info&lt;br /&gt;
 * 1 notice&lt;br /&gt;
 * 2 warning&lt;br /&gt;
 * 3 error&lt;br /&gt;
 * 4 fatal error&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;systemLogLevel&amp;#039;] = &amp;#039;0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * ext:devlog :: Durch aktivieren werden Fehler an den Developer Log gesendet&lt;br /&gt;
 * http://typo3.org/extensions/repository/view/devlog/current/&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;enable_errorDLOG&amp;#039;] = &amp;#039;1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * ext:devlog :: Durch aktivieren werden auch Ausnahmen (exceptions) an das devlog gesendet&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;enable_exceptionDLOG&amp;#039;] = &amp;#039;1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Aktiviert das Loggen von veralteten Methoden und Funktionen. Standardwert ist &amp;#039;file&amp;#039;&lt;br /&gt;
 * file     The log file will be written to typo3conf/deprecation_[hash-value].log&lt;br /&gt;
 * devlog   The log will be written to the development log&lt;br /&gt;
 * console  The log will be displayed in the Backend&amp;#039;s Debug Console.&lt;br /&gt;
 * &lt;br /&gt;
 * info: The logging options can be combined by comma-separating them.&lt;br /&gt;
 * info2: Ich habe unterschiedliche Meinungen gehört auf welches Setting das Logging für den Livebetrieb eingestellt wird.&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;enableDeprecationLog&amp;#039;] = &amp;#039;console&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Erlaubt es SQL queries im Browser auszugeben&lt;br /&gt;
 * 0 no SQL shown (default)&lt;br /&gt;
 * 1 show only failed queries&lt;br /&gt;
 * 2 show all queries&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;sqlDebug&amp;#039;] = &amp;#039;1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Extensions Skripte (ext_localconf.php und ext_tables.php)&lt;br /&gt;
 * 0 Dateien werden nicht gecached und stattdessen jedes Mal &amp;#039;included&amp;#039;&lt;br /&gt;
 * 1 Skripte werden gecached nach typo3conf/temp_CACHED_[sitePathHash]* (saves some milliseconds even with PHP accelerators)^^&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;EXT&amp;#039;][&amp;#039;extCache&amp;#039;] = &amp;#039;1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Backend Debugging :: Wenn gesetzt, wird &amp;#039;loginrefresh&amp;#039; deaktiviert und &amp;#039;pageRenderer&amp;#039; wird in den Debug Mods versetzt.&lt;br /&gt;
 */&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;debug&amp;#039;] = &amp;#039;1&amp;#039;;&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions&amp;diff=20327</id>
		<title>Typo3 - Extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Extensions&amp;diff=20327"/>
		<updated>2014-07-17T10:25:00Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
[[TYPO3 - Extensions debuggen]]&lt;br /&gt;
&lt;br /&gt;
== Ideen für neue Extensions und Erweiterungen bestehender Extensions ==&lt;br /&gt;
Extension zur automatischen Erzeugung zweispaltiger Inhalte mit Line Count (auch Umbrüche), Hurenkinder und Schusterjungen regelung etc.&lt;br /&gt;
&lt;br /&gt;
Erweiterung der rg_googlemaps mit Listenansicht nach PLZ&lt;br /&gt;
Händlersuche mit Umkreissuche oder Auflistung nach PLZ bereichen (Erweiterung bestehender)&lt;br /&gt;
&lt;br /&gt;
== Extensions programmieren ==&lt;br /&gt;
Infos hierzu gibt es im Abschnitt Extension Kickstarter und unter&lt;br /&gt;
&lt;br /&gt;
[[Typo3 - Extensions programmieren]]&lt;br /&gt;
&lt;br /&gt;
[[TypoScript Einstellungen in Extensions auslagern]]&lt;br /&gt;
&lt;br /&gt;
== Extensions ==&lt;br /&gt;
Todo -&amp;gt; überarbeiten Extensions nach Zweck sortieren.&lt;br /&gt;
===  Verbreitete Extensions aus dem Repository===&lt;br /&gt;
&lt;br /&gt;
dix_easylogin -&amp;gt; zum Verbinden des Logins mit OpenID (Facebook Google Twitter etc.)&lt;br /&gt;
&lt;br /&gt;
[[Real URL (realurl)]]&lt;br /&gt;
&lt;br /&gt;
automakeTemplates&lt;br /&gt;
&lt;br /&gt;
[[Metatags extended (metatags)]]&lt;br /&gt;
&lt;br /&gt;
[[News (tt_news)]]&lt;br /&gt;
&lt;br /&gt;
CleanDB  nf_cleandb&lt;br /&gt;
&lt;br /&gt;
[[Database Integration (wfqbe)]]&lt;br /&gt;
Schweizer Taschenmesser zur Integration von Daten (Bugs beachten)&lt;br /&gt;
&lt;br /&gt;
[[Newsletter mit Direct Mail]]&lt;br /&gt;
====SEO-Extensions====&lt;br /&gt;
&lt;br /&gt;
[[Google Analytics (m1_google_analytics)]]&lt;br /&gt;
&lt;br /&gt;
=== weitere nützliche Extensions ===&lt;br /&gt;
WEC Maps - Mapping extension that connects to geocoding databases and Google Maps API.&lt;br /&gt;
http://typo3.org/extensions/repository/view/wec_map/current/&lt;br /&gt;
&lt;br /&gt;
Quick Google Maps&lt;br /&gt;
http://typo3.org/extensions/repository/view/cbgooglemaps/current/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Browser TYPO3 Frontend Engine&lt;br /&gt;
&lt;br /&gt;
Browser - the TYPO3 Frontend Engine - displays content from related tables. You need 1 line typoscript for a result list with a search form, a record browser and an a-z browser. Images are wrapped self-acting. SEO, Search Engine Optimisation. DRS supports&lt;br /&gt;
====SEO====&lt;br /&gt;
&lt;br /&gt;
simplyrobots - robots.txt erzeugen&lt;br /&gt;
&lt;br /&gt;
==== Lightbox und Co ====&lt;br /&gt;
&lt;br /&gt;
[[TYPO3 - Lightbox und Co]]&lt;br /&gt;
&lt;br /&gt;
Perfect Lightbox&lt;br /&gt;
&lt;br /&gt;
Lightbox-Effekte lassen sich seit TYPO3 4.5 auch relativ einfach ohne Extension nutzen. Siehe hierzu:&lt;br /&gt;
&lt;br /&gt;
http://www.marcoseiler.de/typo3/typo3-inhalte-ausgeben/typo3-lightbox-ohne-extension.html&lt;br /&gt;
&lt;br /&gt;
Clearbox&lt;br /&gt;
&lt;br /&gt;
topup (im Moment keine Extension aber einfach einzubinden: JS einbinden und Rahmen anpassen oder Popup Bild anpassen)&lt;br /&gt;
&lt;br /&gt;
==== Sonstiges ====&lt;br /&gt;
[[ratings - Bewertungen]]&lt;br /&gt;
&lt;br /&gt;
[[t3blog - Blog Extension]]&lt;br /&gt;
&lt;br /&gt;
[[pbsurvey - Umfrage]]&lt;br /&gt;
&lt;br /&gt;
[[tipafriend - Seite weiterempfehlen]]&lt;br /&gt;
&lt;br /&gt;
[[error_404_handling - Seite nicht gefunden]]&lt;br /&gt;
&lt;br /&gt;
[[irfaq - Modern FAQ]]&lt;br /&gt;
&lt;br /&gt;
[[seminars - Kursverwaltung]]&lt;br /&gt;
&lt;br /&gt;
[[tipafriend - Seite an einen Freund versenden]]&lt;br /&gt;
&lt;br /&gt;
mk_wastebasket - Datensätze entgültig löschen&lt;br /&gt;
&lt;br /&gt;
Foreign access for MM Tables  	mmforeign  0.2.0   Experimental&lt;br /&gt;
&lt;br /&gt;
Page Template Selector 	rlmp_tmplselector 	1.2.2 		&lt;br /&gt;
&lt;br /&gt;
TER Update Check 	ter_update_check&lt;br /&gt;
&lt;br /&gt;
Exo Feeds  	exofeeds  	0.0.2	Alpha&lt;br /&gt;
&lt;br /&gt;
freeCap CAPTCHA 	sr_freecap 	&lt;br /&gt;
&lt;br /&gt;
Front End User Registration 	sr_feuser_register 	Stable&lt;br /&gt;
&lt;br /&gt;
Indexed Search Engine 	indexed_search 	2.9.2 	System 	Stable&lt;br /&gt;
&lt;br /&gt;
Language Selection 	sr_language_menu 	&lt;br /&gt;
&lt;br /&gt;
Photo Book 	goof_fotoboek 	1.7.11 	Stable&lt;br /&gt;
&lt;br /&gt;
Local 	Stable&lt;br /&gt;
&lt;br /&gt;
TIMTAB Tag-Cloud 	timtab_tagcloud 1.2.1 			&lt;br /&gt;
&lt;br /&gt;
Make Print Link 	make_printlink 	1.5.2 	Stable&lt;br /&gt;
&lt;br /&gt;
Static Info Tables 	static_info_tables&lt;br /&gt;
&lt;br /&gt;
sb_accessiblecontent&lt;br /&gt;
&lt;br /&gt;
Content/DAM reference usage  	dam_ttcontent (Experimental)&lt;br /&gt;
&lt;br /&gt;
phpmyadmin&lt;br /&gt;
&lt;br /&gt;
DAM inkl Erweiterungen&lt;br /&gt;
&lt;br /&gt;
Media (DAM)  	dam 	Local  	Stable&lt;br /&gt;
&lt;br /&gt;
Media&amp;gt;Categories dam_catedit 	1.0.3 	Local 	Alpha&lt;br /&gt;
&lt;br /&gt;
Media&amp;gt;Indexing 	dam_index 	1.0.3 	Local 	Stable&lt;br /&gt;
&lt;br /&gt;
Media&amp;gt;Info 	dam_info&lt;br /&gt;
&lt;br /&gt;
[[PDF Generator 2 (pdf_generator2)]]&lt;br /&gt;
&lt;br /&gt;
[[Typo3 - Bildergallerie]] (lz_gallery)&lt;br /&gt;
&lt;br /&gt;
[[Modern Guestbook (ve_guestbook)]]&lt;br /&gt;
&lt;br /&gt;
[[Mailformplus (tx_mailformplus)]]&lt;br /&gt;
&lt;br /&gt;
[[Send-a-Card (sr_sendcard)]]&lt;br /&gt;
&lt;br /&gt;
[[Front End User Registration (fe_users)]]&lt;br /&gt;
&lt;br /&gt;
[[FreeCap (sr_freecap)]]&lt;br /&gt;
&lt;br /&gt;
[[Date2Calendar (date2cal)]] JavaScript Datumsauswahl für Datumsfelder im Backend -&amp;gt; inzwischen integriert.&lt;br /&gt;
&lt;br /&gt;
[[Dynamic Flexforms (dynaflex)]] Flexforms während der Laufzeit verändern&lt;br /&gt;
&lt;br /&gt;
[[Google Earth links (itxg_gelinks)]] Allows to create and view Google Earth .kml files. The building of a link is being done with GPS coordinates in D-M-S notation.&lt;br /&gt;
&lt;br /&gt;
[[Google Sitemap for Pages and Contents (mc_googlesitemap)]] All options available&lt;br /&gt;
&lt;br /&gt;
== Der Typo3 Extension Kickstarter ==&lt;br /&gt;
(Deutsch: Erweiterungs Manager)&lt;br /&gt;
Der Erweiterungsmanager ist selbst eine Erweiterung die zuerst installiert werden muß.&lt;br /&gt;
&lt;br /&gt;
Fehler in Extension Kickstarter&lt;br /&gt;
&lt;br /&gt;
Wenn der Kickstarter local installiert ist, dann kann meine eine bereits erstelle Extension nicht im Kickstarter überarbeiten. (Bis Version ?)&lt;br /&gt;
&lt;br /&gt;
Der Kickstarter muß global installiert sein, damit man bereits erstellte Extension mit dem Kickstarter überarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=== Kurzanleitung ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wo?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Backend-Modul Ext Manager; hier im Dropdown Menü &amp;quot;Make new Extension&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;General Info&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Allgemeine Infos zum PlugIn (hat nichts mit der Funktion zu tun)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Extension Key&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
- Typo3 entfernt Unterstriche (meine_extension wird zu meineextension)&lt;br /&gt;
&lt;br /&gt;
- tx_ wird automatisch vorangestellt&lt;br /&gt;
&lt;br /&gt;
- ein vorangestelltes user_ bedeutet dass es sich um eine eigene Entwicklung handelt, die nicht in das Repository gestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;New Database Tables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Hier kann man automatisch die benötigten Tabellen und deren Felder erzeugen.&lt;br /&gt;
Üblich ist ein Tabellenname mit dem Suffix _main z.B. user_meineErweiterung_main.&lt;br /&gt;
Hier werden auch einige von Typo unterstützte Funktionen die im Backend als Felder sichtbar sind vorbereitet (z.B. Start, Stop, Hide...). Sinnvoll in diesem Zusammenhang:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Delete*&amp;#039;&amp;#039; - damit die Tabelle ein Delete Flag bekommt&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Hide*&amp;#039;&amp;#039; - damit Datensätze versteckt werden können &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Allowed on Pages&amp;#039;&amp;#039; - Damit Frontend Plugins auch als Inhaltselement im Backend ausgewählt werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Save and new&amp;#039;&amp;#039; - damit können später schnell mehrere Datensätze angelegt werden.&lt;br /&gt;
&lt;br /&gt;
*Damit das bei der Anzeige Funktioniert muß die Funktionalität in der Datenbankabfrage mit eingebaut werden (d.h. das Flag muß abgefragt werden).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenfelder der Tabelle&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Spalten der Tabelle angelegt. &lt;br /&gt;
&lt;br /&gt;
Field name - Der Name der Spalte in der DB (in Kleinbuchstaben, z.B. vorname)&lt;br /&gt;
&lt;br /&gt;
Field title - wird im Backend beim Eingabefeld angezeigt (z.B. Vorname)&lt;br /&gt;
&lt;br /&gt;
Field type - welche Art von Eingabefeld&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Frontend Plugins&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Integration ins Frontend&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Enter a title for the plugin&amp;#039;&amp;#039; - taucht in der Auswahlliste für die Plugins aus (Backend)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;USER cObjects are cached&amp;#039;&amp;#039; - Auswählen ob gecached wird (für Entwicklung bietet sich das deaktivieren des Caches an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;...Typo Script Code...&amp;#039;&amp;#039; - den Beispielcode braucht man i.d.R. nicht, ein einfacher Code wird denoch generiert.&lt;br /&gt;
&lt;br /&gt;
weiter unten kann noch angegeben werden wo das Plugin zugänglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;View Result&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man sehen was erzeugt wird...&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Write&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
... und hier wird es tatsächlich erzeugt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bilder in eigener Extension rendern ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel benutzte Variablen:&lt;br /&gt;
 $BildAdresse&lt;br /&gt;
 $ParameterFuerImgTag&lt;br /&gt;
 $Alttext&lt;br /&gt;
&lt;br /&gt;
In PHP-Datei der Extension:&lt;br /&gt;
&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;file&amp;quot;]=&amp;quot;uploads/pics/&amp;quot;.$BildAdresse;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;params&amp;quot;]=$ParameterFuerImgTag;&lt;br /&gt;
 $this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;][&amp;quot;altText&amp;quot;]=$Alttext;&lt;br /&gt;
 $Bild=$this-&amp;gt;cObj-&amp;gt;IMAGE($this-&amp;gt;conf[&amp;quot;imageBeispiel.&amp;quot;]);&lt;br /&gt;
 $Content.=$Bild;&lt;br /&gt;
&lt;br /&gt;
In Typoscript Setup&lt;br /&gt;
&lt;br /&gt;
 plugin.tx_hoTest_pi1 {     //hier Plugin-Name&lt;br /&gt;
 imageArtikel{&lt;br /&gt;
     file.maxW = {$ho_Test.BildWidthNews}  &lt;br /&gt;
     imageLinkWrap = 1&lt;br /&gt;
     imageLinkWrap {&lt;br /&gt;
       enable = 1&lt;br /&gt;
       bodyTag = &amp;lt;BODY bgColor=white&amp;gt;&lt;br /&gt;
       wrap = |&lt;br /&gt;
       width = 400m&lt;br /&gt;
       height = 400&lt;br /&gt;
       JSwindow = 1&lt;br /&gt;
       JSwindow.newWindow = 1&lt;br /&gt;
       JSwindow.expand = 17,20&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der Wert {$ho_Test.BildWidthNews} kann aus Constants übernommen werden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch&lt;br /&gt;
Konstanten von Constants im Setup verwenden&lt;br /&gt;
und&lt;br /&gt;
Konstanten für Constant-Editor bereitstellen&lt;br /&gt;
&lt;br /&gt;
(aus www.easy-office4you.de/ 10.1.2006)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spalten der Seiten umbenennen ==&lt;br /&gt;
&lt;br /&gt;
Um die Spalten der Seite im Backend beliebig umzubenennen und/oder zusätzliche eigene Spalten zu verwenden, muß die Extension zed_more_columns installiert werden und dann in der Datei ext_tables.php die Spalten-Namen eingeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 $TCA[&amp;quot;tt_content&amp;quot;][&amp;quot;columns&amp;quot;][&amp;quot;colPos&amp;quot;][&amp;quot;config&amp;quot;][&amp;quot;items&amp;quot;] = array (&lt;br /&gt;
 &amp;quot;0&amp;quot; =&amp;gt; array (&amp;quot;Mitte||Mitte||||||||&amp;quot;,&amp;quot;0&amp;quot;),&lt;br /&gt;
 &amp;quot;1&amp;quot; =&amp;gt; array (&amp;quot;Links||Links||||||||&amp;quot;,&amp;quot;1&amp;quot;),&lt;br /&gt;
 &amp;quot;2&amp;quot; =&amp;gt; array (&amp;quot;Rechts||Rechts||||||||&amp;quot;,&amp;quot;2&amp;quot;),&lt;br /&gt;
 &amp;quot;3&amp;quot; =&amp;gt; array (&amp;quot;Teaser||Teaser||||||||&amp;quot;,&amp;quot;3&amp;quot;),&lt;br /&gt;
 &amp;quot;4&amp;quot; =&amp;gt; array (&amp;quot;Fusszeile||Fusszeile||||||||&amp;quot;,&amp;quot;4&amp;quot;)&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== Bei Extension dafür sorgen, daß im Backend kein Sortierungs-Button entsteht ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Datei ext_tables.php der Extension folgende Zeile ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;sortby&amp;quot; =&amp;gt; &amp;quot;name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
ändern in&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;default_sortby&amp;quot; =&amp;gt; &amp;quot;ORDER BY name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Anstatt &amp;quot;name&amp;quot; kann natürlich auch ein anderes Suchkriterium verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigene Extensions ==&lt;br /&gt;
[[GB Glossary (gbglossary)]] - Ajax basiertes Glossar mit diversen Zusatzfunktionen&lt;br /&gt;
&lt;br /&gt;
[[GB Minishop (gbminishop)]]&lt;br /&gt;
&lt;br /&gt;
[[Geo-bit Extension GB Bulletin - gb_bulletin]]&lt;br /&gt;
&lt;br /&gt;
[[Typo3 Extension: pupmanager]]&lt;br /&gt;
&lt;br /&gt;
More Pics In A Row - Mini Extension um mehr Bilder im Bilder Inhaltselement zu erlauben&lt;br /&gt;
&lt;br /&gt;
GB More FE Fields  	gb_morefefield&lt;br /&gt;
&lt;br /&gt;
HfWU Personal  	hfwupersonal&lt;br /&gt;
&lt;br /&gt;
HfWU Studium  	hfwustudium  - Bildet Fakultäten, Studiengänge und Fächer Hierarchisch ab.&lt;br /&gt;
&lt;br /&gt;
HfWU Studium FE  	hfwustudiumfe - Frontendausgabe für hfwustudium&lt;br /&gt;
&lt;br /&gt;
HfWU Dozenten  	hfwudozent - Bildet Dozenten ab und ordnet diese Studienfächern von hfwustudiumfe zu&lt;br /&gt;
&lt;br /&gt;
hfwuwebboard  	hfwuwebboard - Webbretter basierend auf hfwustudium&lt;br /&gt;
&lt;br /&gt;
HFWU Events  	hfwu_events - Veranstaltungskalender&lt;br /&gt;
&lt;br /&gt;
Dekra Certification Database  	gbdekracert - Verwaltung von Zertifikatsträgern&lt;br /&gt;
&lt;br /&gt;
GB Flow Control  	gbflowcontrol - Management des Trikotsproduktions und Auslieferungsablaufs für Schiedsrichter&lt;br /&gt;
&lt;br /&gt;
Flowcontrol Extender  	gbflowcontrolext - ?&lt;br /&gt;
&lt;br /&gt;
GB Adress Display  	gbaddress - ?&lt;br /&gt;
&lt;br /&gt;
GB Camp Finder  	gbcamps - Veranstaltungen zugeschnitten auf AK-Freizeiten.de&lt;br /&gt;
&lt;br /&gt;
Geo-bit Seminars  	gbseminars - &lt;br /&gt;
&lt;br /&gt;
Job Manager  	gbjobmanager&lt;br /&gt;
&lt;br /&gt;
Events  	gb_events&lt;br /&gt;
&lt;br /&gt;
[[Geo-bit csv Importer - gbimporter]] - Konfigurierbares Importtool&lt;br /&gt;
&lt;br /&gt;
Geo-bit Typo3 Settings  	[[gbt3settings]] - fertige Settings (obsolet)&lt;br /&gt;
&lt;br /&gt;
Telecash Form - Bezahlung über Telecash&lt;br /&gt;
&lt;br /&gt;
Bilboard - Comments - Tagcloud - Kombination aus Tagcloud Kommentarfunktion und eigener Extension für Aushänge&lt;br /&gt;
&lt;br /&gt;
iFrame Loader&lt;br /&gt;
&lt;br /&gt;
GP Logger&lt;br /&gt;
&lt;br /&gt;
Geosearch&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=20324</id>
		<title>Abstimmung wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=20324"/>
		<updated>2014-07-15T08:59:53Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wordpress Extension Yop Poll - verwendet bei Mascha im Blog intern:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== yop poll Anpassungen ==&lt;br /&gt;
&lt;br /&gt;
Da bei einem custom text field bei der fragesstellung nur einzeiliger text möglich war, musst die datei &lt;br /&gt;
 /wp-content/plugins/yop-poll/inc/yop_poll_model.php&lt;br /&gt;
angepasst werden. &lt;br /&gt;
&lt;br /&gt;
In Zeile 2877&lt;br /&gt;
&lt;br /&gt;
Orginal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$temp_string	= str_ireplace( &amp;#039;%POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;#039;, &amp;#039;&amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;&amp;quot; name=&amp;quot;yop_poll_customfield[&amp;#039;.$custom_field[&amp;#039;id&amp;#039;].&amp;#039;]&amp;quot; id=&amp;quot;yop-poll-customfield-&amp;#039;.$custom_field[&amp;#039;id&amp;#039;].&amp;#039;&amp;quot; /&amp;gt;&amp;#039;, $temp_string );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ersetzten durch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$temp_string	= str_ireplace( &amp;#039;%POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;#039;, &amp;#039;&amp;lt;textarea rows=&amp;quot;4&amp;quot; cols=&amp;quot;50&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;&amp;quot; name=&amp;quot;yop_poll_customfield[&amp;#039;.$custom_field[&amp;#039;id&amp;#039;].&amp;#039;]&amp;quot; id=&amp;quot;yop-poll-customfield-&amp;#039;.$custom_field[&amp;#039;id&amp;#039;].&amp;#039;&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;#039;, $temp_string );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der datenbank die Tabelle:&lt;br /&gt;
&lt;br /&gt;
 kas_wp_yop_poll_votes_custom_fields&lt;br /&gt;
&lt;br /&gt;
Feld: custom_field_value&lt;br /&gt;
&lt;br /&gt;
von varchar (255) auf Text geändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abfrage für Antworten mit Kommentar ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT *&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
LEFT OUTER JOIN `kas_wp_yop_poll_votes_custom_fields` ON `kas_wp_yop_poll_logs`.`vote_id` = `kas_wp_yop_poll_votes_custom_fields`.`vote_id`&lt;br /&gt;
WHERE `kas_wp_yop_poll_logs`.`poll_id` =13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Neue Umfrage Erstellen ==&lt;br /&gt;
=== Vorlagen für Mascha ===&lt;br /&gt;
Vorlagen erstellen:&lt;br /&gt;
=== Ablauf der Umfrage ===&lt;br /&gt;
=== Auswertung der Umfrage ===&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=20323</id>
		<title>JQuery</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=20323"/>
		<updated>2014-07-07T10:16:56Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Über Google */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Quickstart==&lt;br /&gt;
&lt;br /&gt;
http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery&lt;br /&gt;
&lt;br /&gt;
Gut durchlesen, hier werden die meisten Basics angesprochen.&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Elemente auswählen: http://docs.jquery.com/DOM/Traversing/Selectors&lt;br /&gt;
&lt;br /&gt;
Ereignisse: http://docs.jquery.com/Events&lt;br /&gt;
&lt;br /&gt;
Gute Tools out of the Box:&lt;br /&gt;
Erste Wahl mit allem was man so braucht sind die jQuery Tools:&lt;br /&gt;
&lt;br /&gt;
http://flowplayer.org/tools/index.html &lt;br /&gt;
&lt;br /&gt;
Oder in Kurzform hier: [[JQuery Tools (flowplayer.org)]]&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
Validierung mit jQuery: [[Validate (jQuery Plugin)]]&lt;br /&gt;
&lt;br /&gt;
==Einbinden==&lt;br /&gt;
Es gibt die Core Datei und einige nützliche Erweiterungen die man sich passend zusammestellen kann um die Download Größe klein zu halten. Außerdem gibt es gepackte Versionen.&lt;br /&gt;
&lt;br /&gt;
===Über Google===&lt;br /&gt;
&lt;br /&gt;
Hinweis: Google gibt an man solle zuerst den API Code übergeben damit es funktioniert (Obsolet). Der direkte Zugriff funktioniert aber auch ohne. Vielleicht geht es nicht wenn man die google. load Funktion nutzt (hier nicht weiter behandelt) .&lt;br /&gt;
&lt;br /&gt;
Beispiel API Code Übergabe:&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi?key=INSERT-YOUR-KEY&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ui steht für User Interface (Plugins)&lt;br /&gt;
&lt;br /&gt;
=== Über jQuery Server ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Libary auf eigenem Server ===&lt;br /&gt;
==== Geo-bit webmynet ====&lt;br /&gt;
ToDo -&amp;gt; Idee ist verschiedene libs auf tools.webmynet.de vorzuhalten ähnlich wie sie auf dem Google Server liegen.&lt;br /&gt;
Zweck: einfache Einbindung, Statistik, Testing&lt;br /&gt;
&lt;br /&gt;
=== Typo3 ===&lt;br /&gt;
siehe JavaScript Frameworks nutzen&lt;br /&gt;
&lt;br /&gt;
== Der Beginn ==&lt;br /&gt;
In der Regel soll es losgehen, sobald das Dokument geladen ist (weil dies für manche Manipulationen notwendig ist) Deshalb beginnt man i.d.R. mit einem Onload Event:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder Abgekürzt&lt;br /&gt;
&lt;br /&gt;
 $(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
== Reagieren auf Klick ==&lt;br /&gt;
Siehe auch:&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).click(function() {&lt;br /&gt;
     alert(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  $(&amp;quot;a&amp;quot;)&lt;br /&gt;
bedeutet Das was jetzt kommt gilt für alle Links &lt;br /&gt;
 .click()&lt;br /&gt;
es soll bei Klick etwas passieren&lt;br /&gt;
&lt;br /&gt;
Früher hat man das so gelöst:&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;quot; onclick=&amp;quot;alert(&amp;#039;Hello world&amp;#039;)&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&lt;br /&gt;
Das funktioniert, allerdings muß man hier bei jedem Link den Schnipsel einfügen.&lt;br /&gt;
&lt;br /&gt;
== Zugriff auf Elemente ==&lt;br /&gt;
Old School:&lt;br /&gt;
 document.getElementById(&amp;quot;orderedlist&amp;quot;)&lt;br /&gt;
Mit JQuery analog zu obigem Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).addClass(&amp;quot;red&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird noch eine Klasse eingebaut&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Weitere Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  $(&amp;quot;#orderedlist &amp;gt; li&amp;quot;)&lt;br /&gt;
Alle Listenelemente unterhalb #orderedlist&lt;br /&gt;
 #orderedlist li:last&lt;br /&gt;
Hier ist nur das letzte Listenelement gemeint.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist li:last&amp;quot;).hover(function() {&lt;br /&gt;
     $(this).addClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).removeClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Hoverfunktion kann zwei Funktionen als Parameter aufnehmen.&lt;br /&gt;
&lt;br /&gt;
== Elemente manipulieren, hinzufügen, entfernen ==&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
 find()&lt;br /&gt;
 addClass()&lt;br /&gt;
 removeClass()&lt;br /&gt;
 hover()&lt;br /&gt;
 each()&lt;br /&gt;
 append()&lt;br /&gt;
&lt;br /&gt;
== Ereignisse ==&lt;br /&gt;
[[jQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
== AJAX ==&lt;br /&gt;
[[jQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Find some li s and append Text&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).find(&amp;quot;li&amp;quot;).each(function(i) {&lt;br /&gt;
     $(this).append( &amp;quot; BAM! &amp;quot; + i );&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;a[href*=/content/gallery]&amp;quot;).click(function() {&lt;br /&gt;
     // do something with all links that point somewhere to /content/gallery&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset a single form&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;)[0].reset();&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset several forms at once&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;).each(function() {&lt;br /&gt;
       this.reset();&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find li elements that does NOT have a parent ul&lt;br /&gt;
   $(document).ready(function() {&lt;br /&gt;
     $(&amp;quot;li&amp;quot;).not(&amp;quot;:has(ul)&amp;quot;).css(&amp;quot;border&amp;quot;, &amp;quot;1px solid black&amp;quot;); &lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find elements with a name attribute&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
      $(&amp;quot;a[name]&amp;quot;).css(&amp;quot;background&amp;quot;, &amp;quot;#eee&amp;quot; );&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
   // Grab the parent&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).hover(function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).addClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).removeClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testen ob jQuery geladen ist ===&lt;br /&gt;
Testen ob geladen, wenn nicht von google holen, wenn nicht verfügbar lokale Version nehmen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuerySrc = &amp;#039;fileadmin/js/jquery-min.js&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// only load jQuery if not present&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;)  {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// if Google is down&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;&amp;quot; + jQuerySrc + &amp;quot;\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Probleme Lösen ==&lt;br /&gt;
[[jQuery - Probleme lösen (Troubleshooting)]]&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=20322</id>
		<title>JQuery</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=20322"/>
		<updated>2014-07-07T10:15:50Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Quickstart==&lt;br /&gt;
&lt;br /&gt;
http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery&lt;br /&gt;
&lt;br /&gt;
Gut durchlesen, hier werden die meisten Basics angesprochen.&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Elemente auswählen: http://docs.jquery.com/DOM/Traversing/Selectors&lt;br /&gt;
&lt;br /&gt;
Ereignisse: http://docs.jquery.com/Events&lt;br /&gt;
&lt;br /&gt;
Gute Tools out of the Box:&lt;br /&gt;
Erste Wahl mit allem was man so braucht sind die jQuery Tools:&lt;br /&gt;
&lt;br /&gt;
http://flowplayer.org/tools/index.html &lt;br /&gt;
&lt;br /&gt;
Oder in Kurzform hier: [[JQuery Tools (flowplayer.org)]]&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
Validierung mit jQuery: [[Validate (jQuery Plugin)]]&lt;br /&gt;
&lt;br /&gt;
==Einbinden==&lt;br /&gt;
Es gibt die Core Datei und einige nützliche Erweiterungen die man sich passend zusammestellen kann um die Download Größe klein zu halten. Außerdem gibt es gepackte Versionen.&lt;br /&gt;
&lt;br /&gt;
===Über Google===&lt;br /&gt;
Hinweis: Google gibt an man solle zuerst den API Code übergeben damit es funktioniert. Der direkte Zugriff funktioniert aber auch ohne. Vielleicht geht es nicht wenn man die google. load Funktion nutzt (hier nicht weiter behandelt) &lt;br /&gt;
&lt;br /&gt;
Beispiel API Code Übergabe:&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi?key=INSERT-YOUR-KEY&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ui steht für User Interface (Plugins)&lt;br /&gt;
&lt;br /&gt;
=== Über jQuery Server ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Libary auf eigenem Server ===&lt;br /&gt;
==== Geo-bit webmynet ====&lt;br /&gt;
ToDo -&amp;gt; Idee ist verschiedene libs auf tools.webmynet.de vorzuhalten ähnlich wie sie auf dem Google Server liegen.&lt;br /&gt;
Zweck: einfache Einbindung, Statistik, Testing&lt;br /&gt;
&lt;br /&gt;
=== Typo3 ===&lt;br /&gt;
siehe JavaScript Frameworks nutzen&lt;br /&gt;
&lt;br /&gt;
== Der Beginn ==&lt;br /&gt;
In der Regel soll es losgehen, sobald das Dokument geladen ist (weil dies für manche Manipulationen notwendig ist) Deshalb beginnt man i.d.R. mit einem Onload Event:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder Abgekürzt&lt;br /&gt;
&lt;br /&gt;
 $(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
== Reagieren auf Klick ==&lt;br /&gt;
Siehe auch:&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).click(function() {&lt;br /&gt;
     alert(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  $(&amp;quot;a&amp;quot;)&lt;br /&gt;
bedeutet Das was jetzt kommt gilt für alle Links &lt;br /&gt;
 .click()&lt;br /&gt;
es soll bei Klick etwas passieren&lt;br /&gt;
&lt;br /&gt;
Früher hat man das so gelöst:&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;quot; onclick=&amp;quot;alert(&amp;#039;Hello world&amp;#039;)&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&lt;br /&gt;
Das funktioniert, allerdings muß man hier bei jedem Link den Schnipsel einfügen.&lt;br /&gt;
&lt;br /&gt;
== Zugriff auf Elemente ==&lt;br /&gt;
Old School:&lt;br /&gt;
 document.getElementById(&amp;quot;orderedlist&amp;quot;)&lt;br /&gt;
Mit JQuery analog zu obigem Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).addClass(&amp;quot;red&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird noch eine Klasse eingebaut&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Weitere Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  $(&amp;quot;#orderedlist &amp;gt; li&amp;quot;)&lt;br /&gt;
Alle Listenelemente unterhalb #orderedlist&lt;br /&gt;
 #orderedlist li:last&lt;br /&gt;
Hier ist nur das letzte Listenelement gemeint.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist li:last&amp;quot;).hover(function() {&lt;br /&gt;
     $(this).addClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).removeClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Hoverfunktion kann zwei Funktionen als Parameter aufnehmen.&lt;br /&gt;
&lt;br /&gt;
== Elemente manipulieren, hinzufügen, entfernen ==&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
 find()&lt;br /&gt;
 addClass()&lt;br /&gt;
 removeClass()&lt;br /&gt;
 hover()&lt;br /&gt;
 each()&lt;br /&gt;
 append()&lt;br /&gt;
&lt;br /&gt;
== Ereignisse ==&lt;br /&gt;
[[jQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
== AJAX ==&lt;br /&gt;
[[jQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Find some li s and append Text&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).find(&amp;quot;li&amp;quot;).each(function(i) {&lt;br /&gt;
     $(this).append( &amp;quot; BAM! &amp;quot; + i );&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;a[href*=/content/gallery]&amp;quot;).click(function() {&lt;br /&gt;
     // do something with all links that point somewhere to /content/gallery&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset a single form&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;)[0].reset();&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset several forms at once&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;).each(function() {&lt;br /&gt;
       this.reset();&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find li elements that does NOT have a parent ul&lt;br /&gt;
   $(document).ready(function() {&lt;br /&gt;
     $(&amp;quot;li&amp;quot;).not(&amp;quot;:has(ul)&amp;quot;).css(&amp;quot;border&amp;quot;, &amp;quot;1px solid black&amp;quot;); &lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find elements with a name attribute&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
      $(&amp;quot;a[name]&amp;quot;).css(&amp;quot;background&amp;quot;, &amp;quot;#eee&amp;quot; );&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
   // Grab the parent&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).hover(function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).addClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).removeClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testen ob jQuery geladen ist ===&lt;br /&gt;
Testen ob geladen, wenn nicht von google holen, wenn nicht verfügbar lokale Version nehmen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuerySrc = &amp;#039;fileadmin/js/jquery-min.js&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// only load jQuery if not present&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;)  {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// if Google is down&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;&amp;quot; + jQuerySrc + &amp;quot;\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Probleme Lösen ==&lt;br /&gt;
[[jQuery - Probleme lösen (Troubleshooting)]]&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=20321</id>
		<title>JQuery</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=20321"/>
		<updated>2014-07-07T10:15:22Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Reagieren auf Klick */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Quickstart==&lt;br /&gt;
&lt;br /&gt;
http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery&lt;br /&gt;
&lt;br /&gt;
Gut durchlesen, hier werden die meisten Basics angesprochen.&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Elemente auswählen: http://docs.jquery.com/DOM/Traversing/Selectors&lt;br /&gt;
&lt;br /&gt;
Ereignisse: http://docs.jquery.com/Events&lt;br /&gt;
&lt;br /&gt;
Gute Tools out of the Box:&lt;br /&gt;
Erste Wahl mit allem was man so braucht sind die jQuery Tools:&lt;br /&gt;
&lt;br /&gt;
http://flowplayer.org/tools/index.html &lt;br /&gt;
&lt;br /&gt;
Oder in Kurzform hier: [[JQuery Tools (flowplayer.org)]]&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
Validierung mit jQuery: [[Validate (jQuery Plugin)]]&lt;br /&gt;
&lt;br /&gt;
==Einbinden==&lt;br /&gt;
Es gibt die Core Datei und einige nützliche Erweiterungen die man sich passend zusammestellen kann um die Download Größe klein zu halten. Außerdem gibt es gepackte Versionen.&lt;br /&gt;
&lt;br /&gt;
===Über Google===&lt;br /&gt;
Hinweis: Google gibt an man solle zuerst den API Code übergeben damit es funktioniert. Der direkte Zugriff funktioniert aber auch ohne. Vielleicht geht es nicht wenn man die google. load Funktion nutzt (hier nicht weiter behandelt) &lt;br /&gt;
&lt;br /&gt;
Beispiel API Code Übergabe:&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi?key=INSERT-YOUR-KEY&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ui steht für User Interface (Plugins)&lt;br /&gt;
&lt;br /&gt;
=== Über jQuery Server ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Libary auf eigenem Server ===&lt;br /&gt;
==== Geo-bit webmynet ====&lt;br /&gt;
ToDo -&amp;gt; Idee ist verschiedene libs auf tools.webmynet.de vorzuhalten ähnlich wie sie auf dem Google Server liegen.&lt;br /&gt;
Zweck: einfache Einbindung, Statistik, Testing&lt;br /&gt;
&lt;br /&gt;
=== Typo3 ===&lt;br /&gt;
siehe JavaScript Frameworks nutzen&lt;br /&gt;
&lt;br /&gt;
== Der Beginn ==&lt;br /&gt;
In der Regel soll es losgehen, sobald das Dokument geladen ist (weil dies für manche Manipulationen notwendig ist) Deshalb beginnt man i.d.R. mit einem Onload Event:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder Abgekürzt&lt;br /&gt;
&lt;br /&gt;
 $(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
== Reagieren auf Klick ==&lt;br /&gt;
Siehe auch:&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).click(function() {&lt;br /&gt;
     alert(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  $(&amp;quot;a&amp;quot;)&lt;br /&gt;
bedeutet Das was jetzt kommt gilt für alle Links &lt;br /&gt;
 .click()&lt;br /&gt;
es soll bei Klick etwas passieren&lt;br /&gt;
&lt;br /&gt;
Früher hat man das so gelöst:&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;quot; onclick=&amp;quot;alert(&amp;#039;Hello world&amp;#039;)&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&lt;br /&gt;
Das funktioniert, allerdings muß man hier bei jedem Link den Schnipsel einfügen.&lt;br /&gt;
&lt;br /&gt;
== Zugriff auf Elemente ==&lt;br /&gt;
Old School:&lt;br /&gt;
 document.getElementById(&amp;quot;orderedlist&amp;quot;)&lt;br /&gt;
Mit JQuery analog zu obigem Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).addClass(&amp;quot;red&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird noch eine Klasse eingebaut&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Weitere Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  $(&amp;quot;#orderedlist &amp;gt; li&amp;quot;)&lt;br /&gt;
Alle Listenelemente unterhalb #orderedlist&lt;br /&gt;
 #orderedlist li:last&lt;br /&gt;
Hier ist nur das letzte Listenelement gemeint.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist li:last&amp;quot;).hover(function() {&lt;br /&gt;
     $(this).addClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).removeClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Hoverfunktion kann zwei Funktionen als Parameter aufnehmen.&lt;br /&gt;
&lt;br /&gt;
== Elemente manipulieren, hinzufügen, entfernen ==&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
 find()&lt;br /&gt;
 addClass()&lt;br /&gt;
 removeClass()&lt;br /&gt;
 hover()&lt;br /&gt;
 each()&lt;br /&gt;
 append()&lt;br /&gt;
&lt;br /&gt;
== Ereignisse ==&lt;br /&gt;
[[jQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
== AJAX ==&lt;br /&gt;
[[jQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Find some li s and append Text&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).find(&amp;quot;li&amp;quot;).each(function(i) {&lt;br /&gt;
     $(this).append( &amp;quot; BAM! &amp;quot; + i );&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;a[href*=/content/gallery]&amp;quot;).click(function() {&lt;br /&gt;
     // do something with all links that point somewhere to /content/gallery&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset a single form&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;)[0].reset();&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset several forms at once&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;).each(function() {&lt;br /&gt;
       this.reset();&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find li elements that does NOT have a parent ul&lt;br /&gt;
   $(document).ready(function() {&lt;br /&gt;
     $(&amp;quot;li&amp;quot;).not(&amp;quot;:has(ul)&amp;quot;).css(&amp;quot;border&amp;quot;, &amp;quot;1px solid black&amp;quot;); &lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find elements with a name attribute&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
      $(&amp;quot;a[name]&amp;quot;).css(&amp;quot;background&amp;quot;, &amp;quot;#eee&amp;quot; );&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
   // Grab the parent&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).hover(function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).addClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).removeClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testen ob jQuery geladen ist ===&lt;br /&gt;
Testen ob geladen, wenn nicht von google holen, wenn nicht verfügbar lokale Version nehmen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuerySrc = &amp;#039;fileadmin/js/jquery-min.js&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// only load jQuery if not present&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;)  {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// if Google is down&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;&amp;quot; + jQuerySrc + &amp;quot;\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Probleme Lösen ==&lt;br /&gt;
[[jQuery - Probleme lösen (Troubleshooting)]]&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JSON&amp;diff=20320</id>
		<title>JSON</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JSON&amp;diff=20320"/>
		<updated>2014-07-04T08:36:17Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JSON - JavaScript Object Notation ==&lt;br /&gt;
&lt;br /&gt;
Kann XML Datenstrukturen ersetzen und hat dabei wesentlich weniger Overhead. Derzeit der Quasi-Standard.&lt;br /&gt;
&lt;br /&gt;
- Lesbar für Menschen&lt;br /&gt;
&lt;br /&gt;
- Einfach zu Parsen für Maschinen&lt;br /&gt;
&lt;br /&gt;
- Leichtgewichtig&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.json.org/js.html&lt;br /&gt;
&lt;br /&gt;
[[PHP und JSON]]&lt;br /&gt;
&lt;br /&gt;
[[JQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
http://json.org/&lt;br /&gt;
&lt;br /&gt;
http://json.org/json-de.html&lt;br /&gt;
&lt;br /&gt;
http://www.jsoneditoronline.org/&lt;br /&gt;
&lt;br /&gt;
== Erweiterungen ==&lt;br /&gt;
GeoJson - Spezifikation für Geoobjekte&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JSON&amp;diff=20319</id>
		<title>JSON</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JSON&amp;diff=20319"/>
		<updated>2014-07-04T08:35:45Z</updated>

		<summary type="html">&lt;p&gt;134.3.57.182: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JSON - JavaScript Object Notation ==&lt;br /&gt;
&lt;br /&gt;
Kann XML Datenstrukturen ersetzen und hat dabei wesentlich weniger Overhead. Derzeit der Quasi-Standard.&lt;br /&gt;
&lt;br /&gt;
- Lesbar für Menschen&lt;br /&gt;
&lt;br /&gt;
- Einfach zu Parsen für Maschinen&lt;br /&gt;
&lt;br /&gt;
- Leichtgewichtig&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[[http://www.json.org/js-de.html]]&lt;br /&gt;
&lt;br /&gt;
[[PHP und JSON]]&lt;br /&gt;
&lt;br /&gt;
[[JQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
http://json.org/&lt;br /&gt;
&lt;br /&gt;
http://json.org/json-de.html&lt;br /&gt;
&lt;br /&gt;
http://www.jsoneditoronline.org/&lt;br /&gt;
&lt;br /&gt;
== Erweiterungen ==&lt;br /&gt;
GeoJson - Spezifikation für Geoobjekte&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;/div&gt;</summary>
		<author><name>134.3.57.182</name></author>
	</entry>
</feed>