Frage an die PHP-Experten...

Multimedia pur!
Antworten
Benutzeravatar
elevar
Logik-Lord
Logik-Lord
Beiträge: 1411
Registriert: 08.08.2007, 20:04

Re: Frage an die PHP-Experten...

Beitrag von elevar »

@Mic So hätte mir mal jemand reguläre Ausdrücke beibringen müssen =D>
Mic hat geschrieben:-- edit --
Hm, müsste so gehen:

Code: Alles auswählen

$news = preg_replace('/\[LINK,([a-zA-Z]*),[http:\/\/]*([^\]]*)\]([^\[]*)\[\/LINK\]/', '<a href="http://$2" target="_$1">$3</a>', $news);
Nein, so kommt z.B. bei http://haus.de nur "aus.de" als Treffer zurück.

Ich bin so frei, nun meinerseits eine Alternative anzugeben:

Code: Alles auswählen

$news = preg_replace('/\[LINK,([a-zA-Z]*),(?:http:\/\/)?([^\]]*)\]([^\[]*)\[\/LINK\]/', '<a href="http://$2" target="_$1">$3</a>', $news);
Well, it all started on Scabb Island. Some of my admiring fans had pressured me into telling my LeChuck evaporating story once again...
Benutzeravatar
Mic
Adventure-Gott
Adventure-Gott
Beiträge: 4604
Registriert: 28.08.2003, 16:23
Wohnort: Exil-Osnabrücker
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Mic »

elevar hat geschrieben:Nein, so kommt z.B. bei http://haus.de nur "aus.de" als Treffer zurück.
Stimmt, da hast du natürlich vollkommen Recht. Beim niederschreiben hatte ich auch schon so ein ungutes Gefühl.

@Fighty:
Ich bin derzeit auch an einem privaten Projekt am basteln. Habe mich dafür entschlossen, viele Formatierungsmöglichkeiten von phpBB mit zu übernehmen, einfach, weil man es gewohnt ist. Also [ b]..[/b], [ i]..[/i] und so weiter. Links würden dann auch aufgebaut werden in der Form von [ url]http://www.blubb.de[/url] oder Text. Dabei unterscheide ich noch zwischen relativen Links (im selben Fenster zu öffnen) und absoluten Links (Bei Fremddomain im neuen Fenster zu öffnen).

Je nachdem wie weit du schon fortgeschritten bist, kannst du deinen Ansatz ja noch umdenken, sofern dir meiner zusagt.
Wenn Vergangenheit, Gegenwart und Zukunft nichts weiter sind als verlorene Ideen aus einer anderen Ära,
etwa wie Boote auf einem ausgetrockneten See, dann ist die Beendigung eines Prozesses nie zu definieren.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Mic hat geschrieben:Um es noch ein weniger verwirrender zu machen, möchte ich noch eine Alternative vorschlagen:

So, wie du es ja vorhast, werden die Formatierungen direkt vorgenommen. Was zur Folge hat, dass diese Änderungen beim Editieren von News sofort mit angezeigt werden. Wenn du aber erst bei der Ausgabe die Formatierungen vornimmst, so bleibt die Originalformatierungen unangetastet.
Das kam vielleicht falsch rüber, aber die Umwandlung erfolgt erst bei der ANzeige der News. Die ursprünglichen FOrmatierungen bleiben also erhalten bzw. unangetastet.

Danke für die ausführliche Erklärung. Das werd ich mir mal in einer ruhigen Minute zu Gemüte führen.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Also ich hab mir das jetzt mal angesehen und dem Grunde nach auch verstanden. Nur diese eine Stelle ist mir noch nicht ganz klar...

Code: Alles auswählen

(?:http:\/\/)?
Könnte das nochmal jemand kurz erklären?

Inhaltlich glaube ich es zu verstehen. Dieser String wird als "kann"-string im Gesamtstring deklariert und sofern er gefunden wird, einfach ignoriert, richtig?

Welche Funktion im einzelnen haben da nun die "?" ?
Benutzeravatar
elevar
Logik-Lord
Logik-Lord
Beiträge: 1411
Registriert: 08.08.2007, 20:04

Re: Frage an die PHP-Experten...

Beitrag von elevar »

1. Eine Gruppierung (...) wird standardmäßig als Treffer zurückgegeben. Möchte man dies unterdrücken, kann man dies durch (?:...) erreichen.

2. Das Fragezeichen am Ende ist ein Quantifizierer, der angibt, wie oft das vorherige Zeichen bzw. die vorherige Gruppe vorkommen muss. Es bedeutet 'einmal oder keinmal', und ist eine abkürzende Schreibweise für {0,1}
Well, it all started on Scabb Island. Some of my admiring fans had pressured me into telling my LeChuck evaporating story once again...
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Ah! Danke.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Hab noch n kleines Problemchen...

Code: Alles auswählen

$news = preg_replace('/\[LINK,([a-zA-Z]*),(?:http:\/\/)?([^\]]*)\]([^\[]*)\[\/LINK\]/', '<a href="http://$2" target="_$1">$3</a>', $news);
die Variable $1 enhält bei mir entweder "s" oder "n".
Das heißt, damit da ein sinnvoller Link rauskommt, reicht es nicht, einfach nur auf $1 zuzugreifen, sondern je nach Inhalt von $1 muss da noch "self" bzw. "blank" draus gemacht werden. Wie bewerkstelligt man das innerhalb des Funktionsaufrufes?
Kann man das "Aufbereiten" irgendwie in zwei Schritte teilen? So dass ich vorher noch die Variable $1 ummodeln kann?
Benutzeravatar
elevar
Logik-Lord
Logik-Lord
Beiträge: 1411
Registriert: 08.08.2007, 20:04

Re: Frage an die PHP-Experten...

Beitrag von elevar »

Schau dir nochmal mein Beispiel mit preg_replace_callback näher an. Wenn ich dich richtig verstanden habe, wird dein Problem damit gelöst.
Well, it all started on Scabb Island. Some of my admiring fans had pressured me into telling my LeChuck evaporating story once again...
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Funktionuckelt...! Danke.
Aber die Syntax ist echt unterirdisch... Das ist mir jetzt schon an einigen Stellen bei PHP aufgefallen.
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von DasJan »

Meinst du die Syntax von regulären Ausdrücken? Dafür kann PHP nämlich nichts. ;)

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Auch. Ich meine allerdings die generelle Syntax von PHP.
Benutzeravatar
DasJan
Adventure-Treff
Adventure-Treff
Beiträge: 14683
Registriert: 17.02.2002, 17:34
Wohnort: London
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von DasJan »

Hm, die tut doch eigentlich alles, um nicht unangenehm aufzufallen. ;)

Das Jan
"If you are the smartest person in the room, you are in the wrong room."
Beowulf

Re: Frage an die PHP-Experten...

Beitrag von Beowulf »

Der Herr kennt wohl kein Perl! :P

Wenn nur s oder n als erster Parameter erlaubt sind, würde ich folgendes vorschlagen:

Code: Alles auswählen

'/\[LINK,(s|n),(?:http:\/\/)?([^\]]*)\]([^\[]*)\[\/LINK\]/'
Das ist einfacher, sicherer und übersichtlicher. Aber damit ist der Ausdruck noch immer nicht ganz optimal, da der Linktext selber keine eckigen Klammern enthalten darf. Ich würde dies so abändern:

Code: Alles auswählen

'/\[LINK,(s|n),(?:http:\/\/)?(.*?)\](.*?)\[\/LINK\]/'
Durch das ? hinter dem * rattert man nicht direkt mit dem Punkt (der ja für jedes Zeichen außer Newline stehen kann) durch den ganzen Text durch, sondern es wird nur die minimal nötige Anzahl von Zeichen benutzt, damit der Rest des Ausdruckes passt. Dies alles setzt aber voraus, dass die Einstellung für die Ausdrücke auf "greedy" steht (ist wohl der Standard). Ist sie hingegen auf "lazy" gestellt, bewirken die ? genau das Gegenteil. Mehr Infos hier: http://www.php.net/manual/de/regexp.ref ... tition.php

Damit die Groß- und Kleinschreibung keine Rolle spielt, würde ich den i-Modifier vorschlagen:

Code: Alles auswählen

'/\[LINK,(s|n),(?:http:\/\/)?(.*?)\](.*?)\[\/LINK\]/i'
Ob also jemand [link], [LINK], oder [LiNk] schreibt, macht dann keinen Unterschied mehr! :)

Durch ein günstiger gewähltes Begrenzungszeichen hat man noch mehr Übersicht:

Code: Alles auswählen

'#\[LINK,(s|n),(?:http://)?(.*?)\](.*?)\[/LINK\]#i'
Probiers einfach mal aus! :)
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Das muss ich mir mal in ner ruhigen Minute zu Gemüte führen. Danke erstmal.

Ich hab jetzt übrigens meine PHP-Benutzerverwaltung mit der von HTACCESS kombiniert. Der User meldet sich also nur noch einmal an (HTACCESS-Anmeldung) und der Benutzername wird dann an PHP übergeben und mit den Benutzerdaten einer MySQL-Tabelle abgeglichen. Darüber wird dann die entsprechende PHP-Session aufgebaut.
Die administrative Pflege der Benutzerdaten erfolgt in PHP. Man pflegt dort die SQL-Tabelle und gleichzeitig wird die HTACCESS Datei für die User und für die Gruppen gepflegt.

Hier mal die einzelnen Funktionen. Vielleicht kann das jemand gebrauchen (oder noch optimieren...das geht sicher noch eleganter).

EDIT: Hab gerade festgestellt, dass meine Kommentierungen nicht immer stimmen. Habe teile oftmals nur kopiert...

Code: Alles auswählen

	//Userverwaltungsfunktionen
	//neuen User anlegen
	function newuser($username,$passwort) {
		// Name der .htpasswd-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htusers";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		// alle bisherigen Zeilen einlesen und neu schreiben
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
			fputs($f, $htp[$i]);
		}
		// Neuen User anhängen
		fputs($f,$username . ':' . crypt_apr1_md5($passwort) . "\n");
		fclose($f);
	}
	//neuen User einer Gruppe zuordnen
	function newusergroup($username,$group) {
		// Name der .htgroup-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htgroups";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		// alle bisherigen Zeilen einlesen und neu schreiben
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
			//gruppenzeile einlesen und in einzelne Benutzer und den Gruppennamen trennen
			//prüfen, ob die Zeile die richtige Gruppe ist und dann zuweisen des neuen Benutzers
			$zeile = explode(":",$htp[$i]);
			if ($zeile[0]==$group) {
				$htp[$i] = str_replace(":", ": ".$username." ", $htp[$i]);
				$htp[$i] = str_replace("  "," ", $htp[$i]);
				}
			fputs($f, $htp[$i]);
		}
		fclose($f);
	}
	
	//User löschen
	function killuser($username) {
		// Name der .htpasswd-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htusers";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		// Zeichenlänge des zu löschenden Usernamens ermitteln
		$usernamelaenge=strlen($username);
		// alle bisherigen Zeilen einlesen und neu schreiben
		// dabei die Zeile, in der der zu löschende User drinsteht aussparen
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
			if (substr($htp[$i],0,$usernamelaenge)!=$username) {
				fputs($f, $htp[$i]);
			}
		}
		fclose($f);
	}
	//user aus der htgroupsdatei löschen
	function killusergroup($username,$group) {
		// Name der .htgroup-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htgroups";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		// alle bisherigen Zeilen einlesen und neu schreiben
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
			//gruppenzeile einlesen und in einzelne Benutzer und den Gruppennamen trennen
			//prüfen, ob die Zeile die richtige Gruppe ist und dann zuweisen des neuen Benutzers
			$zeile = explode(":",$htp[$i]);
			if ($zeile[0]==$group) {
				$htp[$i] = str_replace(" ".$username." "," ", $htp[$i]);
				}
			fputs($f, $htp[$i]);
		}
		fclose($f);
	}	
	
	//Username updaten
	function updatename($usernamealt,$usernameneu) {
		// Name der .htpasswd-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htusers";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		// Zeichenlänge des upzudatenden Usernamens ermitteln
		$usernamelaenge=strlen($username);
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
				if (substr($htp[$i],0,$usernamelaenge)==$username) {
					$htp[$i]=str_replace($usernamealt,$usernameneu,$htp[$i]);
				}
				fputs($f, $htp[$i]);
		}
		fclose($f);
	}
	//Username in der htgroupsdatei updaten
	function updatenamegroup($usernamealt,$usernameneu) {
		// Name der .htpasswd-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htgroups";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
			$htp[$i]=str_replace($usernamealt,$usernameneu,$htp[$i]);
			fputs($f, $htp[$i]);
		}
		fclose($f);
	}
	//Userpasswort updaten
	function updatepasswort($username,$userpassnew) {
		// Name der .htpasswd-Datei (mit Pfad)
		$htpasswd = "../../security/xampp.htusers";
		// .htpasswd einlesen
		$htp = file($htpasswd);
		// Zeichenlänge des upzudatenden Usernamens ermitteln
		$usernamelaenge=strlen($username);
		$f = fopen($htpasswd, "w");
		for ($i = 0; $i < count($htp); $i++) {
				if (substr($htp[$i],0,$usernamelaenge)==$username) {
					$htp[$i]=$username.":".crypt_apr1_md5($userpassnew);
				}
				fputs($f, $htp[$i]);
		}
		fclose($f);
	}
	
	//Gruppenzuordnung ändern
	function groupchange($username,$altegruppe,$neuegruppe){
		//alte Gruppenzugehörigkeit löschen
		killusergroup($username,$altegruppe);
		newusergroup($username,$neuegruppe);
	}
	
	function crypt_apr1_md5($plainpasswd) {  //Funktion für htaccess passwortencryption auf windowssystemen; ansonsten crypt() benutzen
    $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
    $len = strlen($plainpasswd);
    $text = $plainpasswd.'$apr1$'.$salt;
    $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
    for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
    for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
    $bin = pack("H32", md5($text));
    for($i = 0; $i < 1000; $i++) {
        $new = ($i & 1) ? $plainpasswd : $bin;
        if ($i % 3) $new .= $salt;
        if ($i % 7) $new .= $plainpasswd;
        $new .= ($i & 1) ? $bin : $plainpasswd;
        $bin = pack("H32", md5($new));
    }
    for ($i = 0; $i < 5; $i++) {
        $k = $i + 6;
        $j = $i + 12;
        if ($j == 16) $j = 5;
        $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
    }
    $tmp = chr(0).chr(0).$bin[11].$tmp;
    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    "/phpbb/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    return "$"."apr1"."$".$salt."$".$tmp;
	}
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7309
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Frage an die PHP-Experten...

Beitrag von Fightmeyer »

Hallo,

hab mir jetzt einen Anbieter rausgesucht und meine Webspace ist bereits online. Allerdings klappt das PHP-parsen noch nicht.
Nun habe ich gelesen, dass der Anbieter standardmäßig Fast-Cgi an hat, was anscheinend irgendwie auf die PHP-Aufrufe Einfluss hat. (so genau hab ich mich damit nicht beschäftigt, da es ja auf meinem lokalen xampp gut funktioniert hat)
Laufen meine PHP-Scripte überhaupt mit aktiviertem fast-cgi, oder kann man die mit geringen Aufwand anpassen und lauffähig machen? Andernfalls würde ich das fast-cgi deaktiveren lassen. (allerdings klingen die Vorteile von fast-cgi laut Wikipedia recht gut...)
Antworten