PHP-Tricks
Zurück zum Script-DB Eingang
http://www.erleuchtet.kilu.de/Script-DB/index.htm
PHP
PHP4 - PHP5
ACHTUNG: Die meisten hier aufgeführten Scripte gelten für PHP 4!
Einiges muß für PHP 5 ergänzt, geändert bzw. angepaßt werden.
So müssen aus Sicherheitsgründen mögliche Formulareingaben oder Wahlmöglichkeiten auf der Seite explizit deklariert werden, damit das Script die Rückgabewerte verarbeitet:
<?PHP
// Formular-Variablen deklarieren
// einfach:
$SuchTextEingabe = $_POST['SuchTextEingabe'];
$GanzWort = $_POST['GanzWort'];
$GrossKlein = $_POST['GrossKlein'];
...
$Sonstwas = $_POST['Sonstwas'];
usw.
// WENN es sie denn gibt:
if ((isset($_POST['Seite']) == TRUE))
{
$Seite=$_POST['Seite'];
}
// oder
if ($SonstigeBedingung == "erfuellt")
{
$Eingabe=$_POST['Eingabe'];
}
?>
- VOR dem esten Abruf auf der Seite, die das PHP-Script aufruft
(Ist es die selbe Seite, ganz an den Anfang)
Hier Beispielsweise für das Formular:
<BODY>
<P>
<FORM ACTION="sonstwo.php" METHOD="POST">
<P>
<INPUT TYPE="text" NAME="SuchTextEingabe">
<P>
<INPUT TYPE="checkbox" NAME="GanzWort" VALUE="on"> Ganzes Wort
<INPUT TYPE="checkbox" NAME="GrossKlein" VALUE="on"> Gross / Klein
<INPUT TYPE="checkbox" NAME="Sonstwas" VALUE="on"> Sonstwas
<P>
</FORM>
Die eigene Datei findet man jetzt mit
$_SERVER['PHP_SELF']
bzw.
<?php echo ($_SERVER['PHP_SELF']); ?>
Die eigene URL auswerfen:
<A HREF="http:// echo ($_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); ?>">
<?php echo ($_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); ?></A>
----------------
Seit PHP 5.6 setzt PHP einen Standard-Zeichensatz (default charset), selbst wenn keiner konfiguriert ist. Dieser Zeichensatz ist vorbelegt mit UTF-8.
Wer Seiten mit früheren Versionen von PHP erstellt hat und deshalb nur noch Zeichensalat erhält, kann das wieder abschalten, indem in PHP als Erstes dieser Zeichensatz wieder entfernt wird:
// Keine Leerzeichen vor dem Script und keine Ausgabe im
// Script (z.B.: echo, print, ...) vor der Funktion.
header('Content-Type: text/html; charset=""');
[Aus: http://webbausteine.de/blog/tipps/schriftzeichen_richtig_darstellen.php]
--------
Wem auf Grund der Umstellung von PHP auf PHP 5.6 die Funktion "htmlentities" zur Umwandlung von Umlauten und Sonderzeichen in HTML versaut wurde und evtl. nicht an die nun notwendigen Grundeinstellung in der PHP.ini herankommt, muß evtl. die im Text ja nach Sprache vorkommenden Sonderzeichen einzeln austauschen lassen:
// = Suche einzeln nach:
$conf_SearchTEXT = array(
'ü',
'ä',
'ö',
'ß',
'Ü',
'Ä',
'Ö',
);
// = Ersetze einzeln durch:
$conf_ReplaceTEXT = array(
'ü',
'ä',
'ö',
'ß',
'Ü',
'Ä',
'Ö',
);
// - - -
// Alle austauschen:
$ZeilenString = (str_replace($conf_SearchTEXT, $conf_ReplaceTEXT, $ZeilenString));
- Und ggf. wieder zurück
----------------
PHP & HTML
In einer ganz normalen HTML-Seite lassen sich einzelne Werte als PHP einbauen,
! wenn die Seite als .PHP-Seite auf dem Server läuft:
<HTML>
<HEAD>
<TITLE>
Titel mit Datum: <?PHP echo date("d.m.Y"); ?>
</TITLE>
</HEAD>
<BODY>
<P>
Der anzuzeigende Wert XYZ ist:
<?PHP echo "$XYZ"; ?>
</BODY></HTML>
------
Genauso kann man in PHP einzelne HTML-Bereiche auslesen und ausgeben:
<?PHP
// Holt den Titel der Seite:
preg_match("|<title>(.*)</title>|Uis", $ZeilenString, $Titel);
// Holt die META - Beschreibung der Seite:
preg_match("|<META NAME=\"description\" CONTENT=\"(.*)\">|Uis", $ZeilenString, $Beschreibung);
?>
Anker finden
Findet den ersten 'A NAME' - Anker in einem HTML- Abschnitt (String)
[$String = HTML- Abschnitt]
$ErsterAnker = "";
$Ausdruck = "|(<(a.* name=)(.*)[^>]*>)|Uis";
preg_match($Ausdruck, $String, $AnkerVerweis);
$ErsterAnker = $AnkerVerweis[0];
if ($ErsterAnker != "")
{
$NameAnfang1 = 'Name='; // Dann:
$NameAnfang2 = '=';
$Anker1 = stristr(stristr($ErsterAnker, $NameAnfang1), $NameAnfang2);
$NameEnde = '>';
$Anker1 = stristr($Anker1, $NameEnde1, TRUE);
// Trennung ab Leerzeichen, wenn vorhanden
// ACHTUNG: Der Suchbegriff muß vorhanden sein, sonst wird der String verworfen.
if (stristr($Anker1, " ") != FALSE)
{$Anker1 = stristr($Anker1, " ", TRUE);}
$Anker = "#".(trim($Anker1, '\"='));
}
PHP in Java Script
In einer PHP-Datei lassen sich ohne Weiteres PHP-Zeilen in JavaScript einbauen:
<SCRIPT language="JavaScript" type="text/javascript">
<!--
<?PHP print "var Parameter = '$Wert';" ?>
// oder auch
var Parameter ="<?PHP echo($Wert); ?>";
alert (Parameter);
---
// -->
</SCRIPT>
Auf diese Weise lassen sich recht einfach per Formular übertragene Parameter und ihre Werte auf PHP-Seiten auch in Java Script auslesen und übertragen.
PHP wird VOR JS ausgelesen!
ACHTUNG: PHP ist im Gegensatz zu JavaScript ganz außerordentlich "case sensitive", das heißt, es unterscheidet auch bei Variablen und Werten strikt zwischen Groß- und Kleinschreibung!
JavaScript nur in manchen Fällen.
PHP Abfrage & Refresh
Umleiten einer Seite, wenn eine PHP-Bedingung nicht erfüllt ist:
<?PHP
if (!isset ($Wert))
{
print "<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=yxz.htm\"> \n";
}
?>
PHP automatisch aktualisieren
PHP-Seiten automatisch aktualisieren:
Anders als bei JavaScript lassen sich Änderungen durch PHP nicht so leicht aktuell darstellen, da die Verarbeitung auf dem Server stattfindet. Um die Veränderung dem Benutzer auch anzuzeigen, muß die entsprechende Seite (erneut) vom Server geladen werden.
Möglichkeit 1: Zwischenseite benutzen
Mit einem einfachen Verweis wird eine "Zwischenseite" aufgerufen, auf der die PHP- Anweisung steht. Diese ruft dann nach einer bestimmten Zeit (hier 3 Sekunden) die darstellende Seite(erneut) auf.
zwischenseite.php:
<HTML>
<HEAD>
<META http-equiv="REFRESH" content="3; URL= darstellende_seite.php">
<TITLE>Zwischenseite mit PHP-Anweisung</TITLE>
</HEAD>
<BODY>
<?PHP
...Anweisung
?>
<P>
Einen Moment bitte...
<P>
</BODY></HTML>
Möglichkeit 2: Die PHP-Seite sich selber einmal neu laden lassen
Ist eine PHP- Anweisung auf der Seite selbst notiert, sollte die Seite erneut geladen werden, um die Veränderung korrekt darzustellen. Dieses kann zwar durch eine JavaScript- Anweisung im <Body>- Tag automatisiert werden; allerdings würde die Seite sich bei Aufruf dann endlos neu laden. Sie soll sich aber nur ein mal neu vom Server abrufen. Das läßt sich durch eine vorübergehende Namensänderung erreichen:
<HTML>
<HEAD>
<TITLE>Nur 1x sich selbst neu ladenende Seite</TITLE>
<SCRIPT language="javascript" type="text/javascript">
function NamenAendern()
{window.name = "NeuerName"; }
function EinmalLaden()
{if (window.name == "NeuerName")
{location.reload(); window.name = "AlterName"; }}
</SCRIPT>
</HEAD>
<BODY Onload="EinmalLaden();" >
<FORM... Onsubmit="NamenAendern();>
<?PHP
...Anweisung
?>
</FORM>
</BODY></HTML>
PHP-Code-Zeilenumbruch
Um PHP-generierten HTML-Code im Ergebnis lesbarer zu machen, lassen sich Zeilenumbrüche einbauen, entweder codiert oder (im Gegensatz zu JavaScript) auch real::
--------
echo "\n<BR>\n";
echo "\n<BR>\n";
Ergibt:
<BR>
<BR>
---------
echo "
< BR>
< BR>
";
Ergibt:
<BR>
<BR>
----------------------
ECHO " Etwas: <P>
$Das<P>
";
Ist dasselbe wie
ECHO " Etwas: <P>
$Das<P>\n
";
----------------------
Während im PHP-Code Zeilenumbrüche unschädlich sind, markieren sie in JavaScript das Ende einer Anweisung.
Schreibt man also JavaScript in PHP, immer ein /n ans Ende der Zeile setzen!
----------------------
ACHTUNG: Manchmal unterscheidet PHP zwischen einfachen und doppelten Anführungszeichen:
print "\n 1 Tralala \n";
// ist nicht gleich
print '\n 2 Tralala \n';
Ausgabe:
1 Tralala
\n 2 Tralala \n
PHP-Code auslagern
PHP - Code auslagern: [ include ]
PHP-Code auszulagern macht insofern Sinn, als
- Die Datei übersichtlich beliebt
- Das HTML-Gerüst nicht zu sehr leidet
- Die Datei (wenigstens Teilweise) auch lokal im eigenen Browser geprüft werden kann
- Verschiedene PHP-Dateien darauf zugreifen können
Allerdings sollten man dabei darauf achten, Code-Schleifen nicht zu unterbrechen, auch wenn das nicht immer vermieden werden kann.
I. Auslagern aus der PHP-Datei in eine der Script-Datei:
<P>
<!-- PHP - Auslagerung -->
<?PHP include ("ordner/ausgelagert.blb"); ?>
<!-- Die Dateiendung ".blb" ist dabei beliebig gewählt; es handelt wie bei CSS und JavaScript sich um eine reine Textdatei. -->
<!-- Datei- Pfade und Verweise darin so schreiben, als ob sie von der aufrufenden PHP-Datei kommen. -->
<!-- Ende der PHP - Auslagerung -->
<BR clear=all>
II. Weiter auslagern aus der Script-Datei:
include ("teil1.blb");
oder
if ($Irgendwas == "so")
{include ("teil2.blb");}
III. Vorgegebene Werte auslagern
Oft müssen etliche Werte einfach vorgegeben werden, die sich nur selten ändern. Diese lassen sich in eine eigene Datei auslagern:
<?PHP
// Minimalwert
$Minimalwert = 1;
// Maximalwert
$Maximalwert = 2;
// Pfad
$Pfad = "Pfad/Ordner";
// Adresse
$Adresse = "Meine Adresse";
// etc.
$etc = "irgendwas";
?>
Diese Datei mit
<?PHP include ("ordner/dateinamen.blb"); ?>
ganz am Anfang der PHP-Datei einlesen; die Werte stehen von nun an für die gesamte Verarbeitung zur Verfügung.
PHP-Datumsausgabe
PHP - Datumsausgabe
<!-- PHP - Datum -->
Entweder die PHP-Funktion mit einem Text verbinden
[Mit einem '.' - außerhalb der Anführungsstriche!]
<?PHP echo date("d.m.Y") . " ist das heutige Datum." ?>
Oder:
Diese Datei wurde erstellt am
<?PHP echo date("d.m.Y"); echo " um "; echo date("H:i:s"); ?>
[Mit Uhrzeit]
PHP-Werte übertragen
Werteübertragung zwischen Seiten in PHP:
Mit Hilfe eines (versteckten) Formulars lassen sich in PHP Werte von Seite zu Seite übertragen, solange die Kette nicht unterbrochen wird:
<FORM>
<?PHP
echo <input name=\"TextEingabe\" type=\"text\" size=\"30\" maxlength=\"30\" ";
if ($TextEingabe == "")
{
echo "value=\" \" >";
echo "<input type=\"hidden\" name=\"EingabeLeer\" value=\"ja\"> ";
}
else
{
echo "value=\"$TextEingabe\" >";
echo "<input type=\"hidden\" name=\"EingabeLeer\" value=\"nein\"> ";
}
?>
</FORM>
Einmal eingetragene Werte werden so automatisch eingetragen.
Value= "ja" bzw. "nein" wird hier in PHP zum Wert von "$EingabeLeer"
Der Wert von "$EingabeLeer" läßt sich nun im "Gedächtnis" behalten, wenn er unsichtbar übertragen wird:
<FORM>
<?PHP
echo "<input type=\"hidden\" name=\"EingabeLeer\" value=\"$EingabeLeer\">\n";
?>
</FORM>
- - -
Auf ähnliche Weise lassen sich auch Werte von einer .HTML-Seite auf eine .PHP-Seite übertragen:
Hier die Emailadresse eintragen:
<Form Action="formular1.php" method="get">
<input type="text" name="email">
<input type="hidden" name="wasnu" value="anmelden">
<input type="submit" value="anmelden">
</Form>
PHP-Werte addieren
Variable Werte sammeln (Add String) :
Veränderliche Werte innerhalb einer PHP-Schleife zu einem String addieren und diesen anschließend als Array auslesen:
// ADD to ARRAY as STRING: (Erste = 0, bleibt leer)
// Zu String:
$Wert = "$Wert,$NeuerWert";
Wichtig:
// Inner Trim String:
$Wert = eregi_replace("\t", "", $Wert);
$Wert = eregi_replace(" *, *", ",", $Wert);
(PHP arbeitet mit POSIX- Regulären Ausdrücken)
// Sucht für Stripped String nach doppeltem Komma (Array-Trennung):
$WertArray = explode(",,", $Wert);
// Entfernt das grundsätzlich erste (leere) Element eines solchen Arrays:
array_shift($WertArray);
------
Ähnlich:
Schleifendurchläufe hochzählen:
$Zahl = $Zahl+1 ;
$AktuelleNr = $Zahl ;
oder schlicht:
$Zahl++ ;
$AktuelleNr = $Zahl ;
------
Das Ganze geht auch bei Arrays:
Unter Umständen muß anfangs ein leeres Array generiert werden:
$Add_Array = array(""); // Leeres Array, wenn notwendig
$Add_Array = array_merge($Add_Array,$Array);
(vermischt die Werte)
$Add_Array = array_merge_recursive($Add_Array,$Array);
(vermischt die Werte nicht)
// Entfernt doppelte Einträge:
$Add_Array = array_unique($Add_Array);
// Entfernt doppelte Einträgen und setzt wieder durchgängige Schlüssel:
$Add_Array = array_merge_recursive(array_unique($Add_Array));
PHP-Werte hochzählen
Manchmal ist es nützlich, innerhalb einer Schleife die einzelnen Variablen hochzuzählen, um sie bei der Weiterverarbeitung zu unterscheiden
$Zahl = 2;
$WasAuchImmer = "Auto";
for ( $zl=1; $zl < $Zahl+1; $zl++ )
{
$Variable = "$WasAuchImmer$zl";
$Variable = $Variable;
echo "Dieses ist der" . $zl . ". Durchlauf: <br>";
echo "$zl : $Variable <br><br>";
// 1. Zu String:
$Addieren = "$Addieren,$Variable";
}
// 2. Zu Array:
$Alle = explode (',', $Addieren);
// Ausgabe String:
echo $Addieren;
echo "<br><br>";
// Ausgabe Array:
print_r ($Alle);
echo "<P>";
---
Ergibt:
Dieses ist der1. Durchlauf:
1 : Auto1
Dieses ist der2. Durchlauf:
2 : Auto2
,Auto1,Auto2
Array ( [0] => [1] => Auto1 [2] => Auto2 )
(Erstes Element => leer!)
Werte zu Variablen
Werte zu Variablen
Aus einem Wert eine laufende Variable machen:
$Menge = 2;
for($zahl=1; $zahl<$Menge+1; $zahl++)
{
$EtwasNr = "Etwas".$zahl;
$Das = $EtwasNr;
echo "<P> <B>Das ist jetzt</B>: ".$Das." <BR>";
}
FlipFlop Umschalter
Umschalter in PHP
Schaltet nach dem ersten Durchlauf um:
if ($Wert != $Vorgabe)
{
echo "Erster Durchgang";
$Vorgabe = $Wert;
}
Verzeichnisse auslesen
Verzeichnisse auslesen in PHP
// Listet die Dateien im Verzeichnis des gewählten Pfades auf - als Zeichenketten.
$Verzeichnis=opendir ($Pfad);
while ($file = readdir ($Verzeichnis))
{
print ($file. "<BR>");
}
// Liest die Dateien im Verzeichnis des gewählten Pfades aus - als Array
// (aphabetisch auf- bzw. absteigend sortiert)
$Verz= $DatenPfad; // OHNE opendir!
$files1 = scandir($Verz); // alphabetisch absteigend
$files2 = scandir($Verz, 1); // alphabetisch aufsteigend
// Auflisten:
print_r($files1);
print ("<BR>");
print_r($files2);
// Ergebnis:
Array ( [0] => . [1] => .. [2] => aaa.txt [3] => bbb.html [4] => ccc.txt )
Array ( [0] => ccc.txt [1] => bbb.html [2] => aaa.txt [3] => .. [4] => . )
// Im Ergebnis sollen nun bestimmte Zeichenketten unbedingt vorkommen
// Bestimmte andere Zeichenketten sollen aber ausgeschlossen sein (Peter ja, Paul und Mary nicht):
$Pmuster = "\.txt|\.htm"; // Positives Suchmuster:
// Diese Zeichenfolgen sollen im Ergebnis vorkommen
$Nmuster = "ccc|lari|fari"; // Negatives Suchmuster:
// Diese Zeichenfolgen sollen im Ergebnis NICHT vorkommen
// (gleichzeitig)
// - es sind beliebig viele Zeichenfolgen möglich
Diese Suchmuster können auch der Übersicht halber in externe Dateien ausgelagert werden:
$Pmuster = join("|", file("ordner/erlaubt.txt",FILE_IGNORE_NEW_LINES));
$Nmuster = join("|", file("ordner/verboten.txt",FILE_IGNORE_NEW_LINES));
erlaubt.txt: verboten.txt:
\.txt ccc
\.htm lari
fari
/// Ohne Leerzeichen oder Leerzeilen;
// FILE_IGNORE_NEW_LINES löscht den Zeilenumbruch (=Leerzeichen am Ende des String)
// Von
// http://www.hackerboard.de/web-design-und-webbasierte-sprachen/44498-regex-zeichenketten-finden-welche-foo-enthalten-aber-nicht-bar.html
// übernommen und abgeändert
$VSArray = preg_grep('/(?!.*'.$Nmuster.')^.*('.$Pmuster.')/', $files1);
print_r($VSArray);
// Ergebnis:
Array ( [2] => aaa.txt [3] => bbb.html )
Zur Änderung siehe weiter unten: Leerzeilen beseitigen
Datei Auslesen und verdichten
Häufig soll eine Datei, z.B. eine Zitatensammlung, ausgelesen und dargestellt werden. Schädlich dabei sind einzelne Leerzeilen, sowie solche mit Leerzeichen, Tabulatoren und anderen unsichtbaren Inhalten: sie würden eine unsichtbare Ausgabe erzeugen.
Die Dateien müssen also zeilenweise eingelesen, von leeren Einträgen befreit und vor der Ausgabe zusammengefasst werden.
$Datei ="zitate.txt";
$Zeilen1 = file ($Datei);
$Anzahl = count ($Zeilen1);
echo "$Anzahl Zeilen in $Datei. Zweite Zeile: <BR> $Zeilen1[1]";
echo "<P>";
// Anwendung 1:
$var = $Zeilen1;
$var = array_unique($Zeilen1);
// array_unique entfernt Dubletten aus einem array - wenn es denn Dubletten sind;
// Sie müssen genau gleich sein.
for($x=0;$x<count($var);$x++)
{
echo "<br> - $x: -$var[$x]- <br>";
}
// Anwendung 2:
foreach ($var as $value)
{
echo "Ausgabe: $value<br>\n";
// Add String 2:
if (trim($value)!= "")
{
$string = "$string#$value";
}
echo "<P>";
echo "ADDSTRING: $string";
echo "<P>";
}
// Zerlegt den verdichteten String wieder in ein Array:
$array1 = explode("#",$string);
// Entfernt das grundsätzlich erste (leere) Element eines solchen Arrays:
array_shift($array1);
for($x=0;$x<count($array1);$x++)
{
echo "ARRAY_NEU: -$x-$array1[$x]-<BR>";
}
echo "<P>";
foreach ($array1 as $value)
{
echo "Ausgabe2: $value<br>\n";
}
echo "<P>";
// Randomisiere 3:
srand((double)microtime() * 10000000);
$rand_var = array_rand($array1, 3); // At Random II
for($x=0;$x<count($rand_var);$x++)
{
echo "<br> Zeile $rand_var[$x]: " . $array1[$rand_var[$x]] . "<br>";
}
echo "<P>";
Auslesen und Leerzeilen beseitigen
Leerzeilen beseitigen
Zeichenkette vollständig trimmen: Innen alle doppelten Leerzeichen und außen alle Extrazeichen am Kettenanfang und - ende beseitigen:
$search = array(" ");
$replace = array(" ");
$Zeichenkette = trim(str_replace($search, $replace, $Zeichenkette));
------
Aus zwei Textdateien sollen zeilenweise Werte ausgelesen werden.
Dadurch sollen bestimmte Zeichenfolgen im Ergebnis unbedingt vorhanden sein ($Pmuster, OK.txt), andere Zeichenfolgen aber gleichzeitig ausgeschlossen werden ($Nmuster, NICHT.txt); und dabei dürfen weder Leerzeilen mit beliebig vielen Leerzeichen noch ein einfacher Zeilenumbruch in den Textdateien (oder auch aus Formulareingaben) mit verwertet werden.
// $Pmuster: Positives Suchmuster:
// Diese Zeichenfolgen SOLLEN im Ergebnis vorkommen: Aus OK.txt
// $Nmuster: Negatives Suchmuster:
// Diese Zeichenfolgen sollen im Ergebnis NICHT vorkommen: Aus NICHT.txt
$Leerzeile = array(""," "); // Definiert Zeilenumbruch / Leerzeile
$Pmuster = join("|", array_diff(array_map('trim', file("php_hilfe/OK.txt", FILE_IGNORE_NEW_LINES)), $Leerzeile));
$Nmuster = join("|", array_diff(array_map('trim', file("php_hilfe/NICHT.txt", FILE_IGNORE_NEW_LINES)), $Leerzeile));
// Das Folgende wurde von
// http://www.hackerboard.de/web-design-und-webbasierte-sprachen/44498-regex-zeichenketten-finden-welche-foo-enthalten-aber-nicht-bar.html
// übernommen und abgeändert
$Gefiltert[$a] = preg_grep('/(?!.*'.$Nmuster.')^.*'.$Pmuster.'/', $files[$a]);
ZU BEACHTEN:
$Nmuster und $Pmuster sind hier noch einfache, einzelne Zeichenketten (Strings)!
Sind mehrere Ausdrücke zu prüfen, sollte man eigentlich zu Array-Funktionen greifen. Diese haben jedoch die Besonderheit, daß die abzugleichenden Ausdrücke einander exakt entsprechen müssen.
Aber: Man kann $Nmuster und $Pmuster hier auch als "ODER" Zeichenketten schreiben, in welcher die einzelnen Prüf-Ausdrücke mit "|" getrennt nacheinander aufgeführt werden. Dazu muß man den regulären Ausdruck an einer Stelle abändern:
{$Gefiltert[$a] = preg_grep('/(?!.*'.$Nmuster.')^.*'.$Pmuster.'/', $files[$a]);}
wird zu
{$Gefiltert[$a] = preg_grep('/(?!.*'.$Nmuster.')^.*('.$Pmuster.')/', $files[$a]);}
oder
{$Gefiltert[$a] = preg_grep('/(?!.*'.$Nmuster.')^.*('.$Pmuster.')/i', $files[$a]);}
( i = beachtet die Groß- und Kleinschreibung nicht )
Nun wird jede Zeichenkette in $files[$a] gefunden, in dem zwar
eines von den mehreren Suchmustern in $Pmuster = "das|hier|wohl"
vorkommt, aber keines von $Nmuster = "aber|keines|von|diesen":
"hier lang" = ja // (+hier/--0)
"lass uns nach hause gehn" = nein (+0/--0)
"aber das hier ist wohl nichts" = nein (+das+hier+wohl/--aber)
"mehr davon" = nein (+0/--von)
Einzelne dieser Worte oder Werte können ggf. durch einen Ausdruck ersetzt werden, der selbst mehrere durch "|" getrennte Begriffe enthält.
Zur Anwendung siehe weiter oben: Verzeichnisse Auslesen
Array oder String - Text auslesen
Textdateien in PHP auslesen
- und darin enthaltene URLs:
"http://..."
zu anklickbaren Verweisen in HTML machen:
Man muß sich entscheiden: Array oder Zeichenfolge?
$Zeilen = file($Datei);
// Liest die Datei ($Datei) zeilenweise (!) in ein Array.
$JZeilen = join(" ",$Zeilen);
// Macht aus dem Array eine Zeichenfolge
// Achtung:
// Die (neue) Funktion 'file_get_contents()' arbeitet ähnlich wie 'file()', nur mit dem Unterschied,
// dass der Inhalt einer Datei komplett(!) als Zeichenfolge (String) ausgegeben wird
// Weiter:
// [wird der Parameter 'regs' angegeben, werden alle Treffer weiter in einem Array gespeichert]
for($x=0;$x<count($Zeilen);$x++)
{
if ($Suchstring != "" && eregi ($Suchstring, $Zeilen[$x], $regs))
{
// Das folgende trennt eventuelle im Text aufeinanderfolgende URLs:
$ZZeilen = eregi_replace ("http", "|http", $Zeilen[$x]);
// Das nächste wirft die URLs (meistens) als anklickbare Verweise aus.
// Vorher! Alle HTML-Tags in der Textdatei maskieren,
// damit diese in HTML als Text dargestellt werden und kein Unheil anrichten:
$ZZeilen = htmlentities($ZZeilen);
// Von http://www.php-faq.de/q-regexp-uri-klickbar.html / übernommen und abgeändert:
// [Es gibt im Netz noch umfassendere Suchmuster zu finden:
// http://mathiasbynens.be/demo/url-regex]
$suchmuster = '#(^|[^\"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sm';
$ersetzung = "\\1<a href=\"\\2\\3\"><u>\\2\\3</u></a>\\4";
$ZZeilen = preg_replace($suchmuster, $ersetzung, $ZZeilen);
echo $ZZeilen;
}
}
--------------
Will man nur die URLs in Verweise umwandeln, die im Text alleine stehen,
also vorne und hinten durch Leerzeichen oder Zeilenumbrüche abgegrenzt sind,
kann man diesen regulären Ausdruck nehmen:
$suchmuster = "#[ | // Leerzeichen oder Zeilenumbruch vor der URL
]((http|https|ftp)://[^\s$]+)#";
$ZZeilen = preg_replace($suchmuster, ' <A HREF="$1">$1</A> ', $ZZeilen);
Arrays oder Strings kombinieren
Arrays bzw. Strings kombinieren und wechseln:
<?PHP
$Wert1 = "eins";
$Wert2 = "zwei|drei|vier|fünf";
$Wert3 = "vier";
$Wertesammlung = array($Wert1,$Wert2,$Wert3);
$Kombination = implode('|', $Wertesammlung);
// Macht daraus:
// eins|zwei|drei|vier|fünf|vier
echo $Kombination;
// Man kann es auch als Array belassen bzw. ausgeben:
$Array_Kombination = explode("|", $Kombination);
print_r ($Array_Kombination);
// Oder, wenn jeder Wert nur einmal vorkommen soll:
$Array_Kombination = array_unique(explode("|", $Kombination));
// Der Witz liegt darin, für Haupt- und Unterstrings bzw. Haupt- und Unterarrays
// jeweils das selbe Trennzeichen zu benutzen;
// dann zerfällt der String anschließend in ein Array aus kombinierten Einzelwerten.
print_r ($Array_Kombination);
// Allerdings sind nach 'array_unique' die Schlüssel nicht mehr durchgängig vorhanden,
// denn sie werden ggf. mit entfernt.
// Aus:
Array ( [0] => x [1] => x [2] => y )
// wird so:
Array ( [0] => x [2] => y )
// Das führt zu interessanten Verarbeitungsfehlern.
// Lösung: Das Array neu durch nummerieren.
$Array_Kombination = array_merge_recursive($Array_Kombination);
// Ergibt:
Array ( [0] => x [1] => y )
?>
Arrays oder Strings addieren
In PHP Werte laufend rekursiv addieren:
$AddiertesArray = array(); // Für ein Array
for($a=0; $a<$AnzahlDerWerte; $a++)
{
// Addiert die einzelnen Werte zu einem
// Im Array:
$AddiertesArray[$a]=$NeuerWert[$a];
// Im String:
$AddierterWert = $AddierterWert.$NeuerWert[$a];
// Mit Trennzeichen X:
$AddierterWert = $AddierterWert. "X" .$NeuerWert[$a];
}
Bei jedem Durchlauf wird die neue Zeichenkette an die alte angehängt,
optional getrennt durch ein Trennzeichen.
[Im ersten Durchlauf ist der addierte Wert noch nicht vorhanden]
Array auf Wert setzen & prüfen
Leervorgaben
Häufig muß man in PHP (und JavaScript) Variablen oder einen Verarbeitungswert (wieder) auf null setzen bzw. diese definieren, damit das Script im ersten Durchgang keinen Fehler auswirft in der Art "existiert nicht" (im Gegensatz zu set/isset/unset, womit man sie löscht).
In PHP:
$EineVariable = 0;
$EineVariable = "";
...
$EinArray = array();
...
ganz an den Anfang des Skriptes setzen
-----------
Umgekehrt: Die Fehlerabfrage
Prüfen, ob ein Array nicht leer ist, d.h. prüfen, ob ein Array existiert und ob es einen Wert enthält (nicht einen bestimmten, sondern überhaupt irgend einen Wert)
if (is_array($Fragliches_Array) && ((bool)$Fragliches_Array[0]))
liefert FALSE
bei
$Fragliches_Array = "";
$Fragliches_Array = array();
$Fragliches_Array = array("");
- letzterer Fehler ist sonst kaum abzufangen, da PHP in dem Fall automatisch einen Schlüssel generiert
Text-Zeilentrenner
Zeilentrenner
Problem: Eine Textdatei soll zeilenweise eingelesen und zeilenweise getrennt ausgegeben werden
Kein Problem:
// Datei als Array einlesen:
$Zeilen = file($Datei);
print_r($Zeilen);
Soll aber die Datei als Ganzes gelesen und danach in Absätze unterteilt ausgegeben werden,
muß nach (mindestens) doppelten Zeilenumbrüchen gefahndet werden - und das ist nicht ganz so einfach.
So geht es:
// Datei als String einlesen:
$ZeilenString = file_get_contents($Datei);
Anschließend doppelte Zeilenumbrüche suchen;
// Entweder den doppelten Zeilenumbruch direkt in den Code eingeben:
// Den doppelten Zeilenumbruch so lassen!
$Zeilen = explode("
",$ZeilenString);
// Den doppelten Zeilenumbruch so lassen!
// Ohne Einzug!
// oder diese Variante wählen:
$Zeilen = explode("\r\n\r\n",$ZeilenString);
- Was immer auf dem Server geht.
- Wer außerdem die Zeilenumbrüche erhalten will, setzt später davor noch ein
nl2br(...
Ausgabe:
for($x=0;$x<count($Zeilen);$x++)
{
// Ohne Zeilenumbrüche:
echo $Zeilen[$x];
// Mit Zeilenumbrüchen:
echo nl2br($Zeilen[$x]);
}
Mehrere Worte ersetzen
Mehrere Ausdrücke in einem String ersetzen:
$str = 'gehabt haben worden sein.';
$search = array('worden','sein','gehabt','haben');
$replace = array('alles','gut','Morgen','wird');
$Ausgabe = (str_replace($search, $replace, $str));
Ergebnis: Morgen wird alles gut
['str_replace' beachtet dabei Groß- und Kleinschreibung, 'str_ireplace' nicht]
Alternativ (unterscheidet zwischen Groß- und Kleinschreibung):
$Tauschen = array(
"eins" => "zwei",
"sechs" => "sieben",
"zehn" => "dreiundzwanzig",
"und so" => "weiter"
);
$String = strtr($String, $Tauschen);
- So können mit 'strtr' auch unterschiedlich große Ausdrücke ersetz bzw. ausgetauscht werden.
-----
Bestimmte Worte hervorheben, ohne sie zu verändern:
$String = "Zwei mal zweiundzwanzig Zwei";
$Wort = "zwei";
$String = preg_replace('/('.$Wort.')/i', '<B>$1</B>', $String);
Ergibt:
<B>Zwei</B> mal <B>zwei</B>undzwanzig <B>Zwei</B>
- Die Groß- und Kleinschreibung bleibt wie im Original erhalten!
ACHTUNG:
- ('.$Wort.') muß hier in Klammern gesetzt werden, damit PHP es als Variable erkennt, und mit $1 genau den gefundenen Suchausdruck wieder darstellen kann - die zweite Variable (in Klammern) wäre dann $2, und so weiter - aber immer nur innerhalb EIN UND DERSELBEN Ersetzungsfunktion!
- Einzubinden ohne Punkt '.'
- Außer zwischen zwei anderen Variablen - dann ja, aber mit Anführungszeichen: $xy.'$1'.$z
- Den Suchausdruck bei Fehlern versuchsweise doppelt in Anführungszeichen setzen: '/('.$Wort.')/i'
- Bei weiterer Fehlfunktion doppelte Anführungszeichen versuchen: "/<('.$Wort.')/i"
- Mehrere Variable in regulären Suchausdrücken ohne Punkt verbinden: "/<('.$Wort$NochEinWort.')/i"
- Eine solche Such-&-Ersetze- Variable läßt sich durch (einklammern) überall in jedem regulären Ausdruck definieren
HTML- Code validieren
HTML-Code in PHP validieren
- gefunden auf:
http://stackoverflow.com/questions/3059398/how-to-close-unclosed-html-tags
Machmal ist es notwendig, HTML-Code in PHP zu verarbeiten, und nicht immer ist der resultierende HTML- Code korrekt.
Um wenigstens die gröbsten HTML-Fehler, wie nicht geschlossene HTML-Tags, zu beseitigen und einen gültigen HTML-Code zu erzeugen, kann man ab PHP 5 die interne Funktion "DOMDocument" benutzen:
// Parse HTML
$internal_errors = libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML("$MeinHtmlCode");
$MeinHtmlCode = $doc->saveHTML();
libxml_use_internal_errors($internal_errors);
libxml_clear_errors();
Der HTML-String wird damit völlig neu aufgebaut.
Die 'error'- Zeilen davor und danach unterdrücken die dabei entstehenden Fehlermeldungen.
HTML- Code zu Text
HTML-Text komplett zu reinem Text entformatieren:
$Bereinigt = strip_tags($HTMLDatei);
echo html_entity_decode($Bereinigt);
-> Allerdings auch ohne Absätze, jedenfalls in der HTML-Ausgabe.
-> Die originalen Zeilenumbrüche (\r\n) des Quellcode blieben jedoch erhalten;
-> Man kann diese Datei also als Text ausgeben lassen.
print "\n<PRE>\n";
echo html_entity_decode($Bereinigt);
print "\n</PRE>\n";
Wer will, kann andererseits vorher etwa mit
$search = array('<TD>','<LI>','etc.');
$replace = array(';',' - ','etc.');
$HTMLDatei = (str_ireplace($search, $replace, $HTMLDatei));
bestimmte HTML-Tags für die HTML-Ausgabe in eine ansprechende Text-Formatierung umwandeln lassen.
Dagegen die Ausgabe mit Absätzen in HTML:
$Bereinigt = strip_tags($HTMLDatei, '<p><br>');
// Beläßt diese Tags als Ausnahmen bestehen
// Diese und weitereTags können nach Bedarf eingefügt werden, z.B. auch <TD> oder <LI>
echo html_entity_decode($Bereinigt);
[Das Ganze geht natürlich nur, wenn der HTML-Code auch korrekt geschrieben wurde]
HTML-Tags ausschließen
Manchmal möchte man im sichtbaren Text einer HTML-Datei nach einem Begriff suchen,
aber nicht in den HTML-Tags.
Das ist einfacher als man glaubt:
// Holt den Inhalt einer Datei als Zeichenfolge:
$HTMLDatei = file_get_contents("HTML-Datei.htm");
// Entfernt die HTML-Tags
// Auch einfache Kommentare - jedoch nicht HTML-Tags plus Text in Kommentaren!
$Bereinigt = strip_tags($HTMLDatei);
if ($Suche != "" && eregi ($Suche, $Bereinigt, $regs))
{
usw...
}
---
Allerdings ist mit dieser Methode keine Ersetzung im HTML-Code möglich, da dieser durch STRIP_TAGS für die Suche ja beseitigt wurde.
Das ist etwas komplizierter: Suche und Ersetze Text, der nicht in HTML-Tags steht
(geholt von http://stackoverflow.com/ - - negative lookahead, negative Vorausschau)
[~i = ignoriere Großschreibung]
Methode 1:
// - Suche NICHT in Verweisen (A -Tags) - auch nicht im Veweistext zwischen den <A...> </A> - Tags:
$Suche_Das = '~$SuchWort(?![^<]*</a>)~i';
Methode 2:
// - Suche NICHT in Verweisen (A -Tags) - auch nicht im Veweistext zwischen den <A...> </A> - Tags:
$Suche_Das = '~<a.*?</a>(*SKIP)(*F)|$SuchWort~i';
// - Suche NICHT in irgend einem HTML-Tag:
$Suche_Das = '~<.*?>(*SKIP)(*F)|$SuchWort~i';
[*? = Suche so kurz wie möglich - d. h. jeden Tag einzeln nehmen,
und nicht den ersten bis zum letzten Tag im Text als einen einzigen sehen]
// Dann:
$Ergebnis = preg_replace($Suche_Das, $Ersetze_Durch, $HTMLDatei);
Echo $Ergebnis;
Anmerkung:
- Es macht manchmal eine Unterschied, ob man einen komplexen regulären Ausdruck in doppelte "~~" oder einfache '~~' Anführungszeichen setzt.
- Hat man vorher den String auf HTMLEntities gesetzt, muß auch der Ausdruck "<.*?>" in "<.*?>" umgewandelt werden.
- Aber nur dann.
----------------
Ähnlich:
$Suche_Nach = "~<A HREF((?:(?!</A>).)+)$DasHier~i";
Suche nach "<A HREF" gefolgt von etwas, was nicht "</A>" ist (= ersetzbar durch $1), gefolgt von $DasHier;
$Suche_Nach = "~<A HREF((?:(?!</A>).)*)$DasHier~i"; // Sternchen '*' statt Plus '+'
Suche nach "<A HREF" gefolgt von nichts oder etwas, was nicht "</A>" ist (= ersetzbar durch $1), gefolgt von $DasHier;
Seitenbereiche ausblenden
<!-- PHP KOMMENTAR -->
<?PHP if (!($Einblenden)) echo "<!--"; ?>
Dieser Bereich wird ausgeblendet, wenn die Bedingung "Einblenden" nicht gegeben ist.
Allerdings nur ausgeblendet, d.h. PHP-Anweisungen arbeiten noch.
Formular-Sendebuttons z. B. aber können so ausgeblendet werden.
(Geht auch mit JavaScript)
<!-- Ende PHP KOMMENTAR / Notwendig wegen diesem End-Pfeil: -->
Arrays auflösen und Elemente zählen
Arrays auflösen und die Elemente verkoppeln:
if (Irgendwas)
{
// WICHTIG! Parameter-Zähler:
$pz = $pz+1;
if (count($Array) == 2 )
{
// Werte-Zuordnung Einzeln
list($Parameter,$Wert) = $Array;
$Parameter = trim($Parameter);
$Wert = trim($Wert);
echo "\n<BR>\n";
echo "Parameter $pz: $Parameter";
echo "\n<BR> \n";
echo "Wert $pz: $Wert";
echo "\n<P>\n";
$ParameterWert = "$$Parameter = \"$Wert\"";
eval ("\$ParameterWert = $ParameterWert;");
echo "\n<BR> \n";
echo "<U>Wertepaar $pz</U>: $Parameter: $ParameterWert ";
}
Ergibt:
Wertepaar 1: Etwas = soviel
Wertepaar 2: EtwasAnderes = soviel mehr
etc.