• ComputerBase erhält eine Provision für Käufe über eBay-Links.

PHP Mit PHP Text-Datei editieren

jopjip

Ensign
Registriert
Juni 2008
Beiträge
233
Hi,
ich versuche gerade ein Programm zu schreiben, in das ein Pfad über ein HTML-Formular gegeben wird, geöffnet wird dann im PHP-Skript eine Text-Datei, in der Links gespeicher sind, diese txt-Datei sieht z.B. so aus:
PHP:
http://www.google.de/
http://www.amazon.de/
http://ebay.de/

Das Skript soll Die Datei auslesen, den String per explode in ein Array verwandeln und folgende Änderungen vornehmen:
"http://" , "http://www." und der Slash am Ende des Links sollen entfernt werden. Ich weiß PHP ist nicht die optimalte Lösung aber ich beherrsche nur diese eine Programmiersprache ein wenig.

Weiter soll das überarbeitete Array wieder als String umgeschrieben werden und in der Datei abgespeichert werden, die Links sollen wieder durch ein Leerzeichen voneinander getrennt sein.

Hier ist mein funktionsuntüchtiges Skript:
PHP:
<form action="<? $_SERVER['PHP_SELF'];?>" method="post">

<p>W&auml;hlen&nbsp;Sie&nbsp;eine&nbsp;Datei&nbsp;aus</p>

<input type="file" name="pfad" accept="text/*" />

<br />
<br />

<input type="submit" value="Ausf&uuml;hren" />
<input type="hidden" name="sent" value="1" />
</form>

<?
if (!empty($_POST['pfad']))
{
	$zeichenarray = array("http://www." => "", "http://" => "");
	
	$handle = file($_POST['pfad']);
	
	$inhalt = explode("\n", $handle);
	
	$n_inhalt = strstr($inhalt, $zeichenarray);
	
	$laenge = strlen($n_inhalt)-1;
	$erg = substr($n_inhalt, $laenge); 
	
	if ($erg == "/")
	{
		$erg = substr($n_inhalt,0,strlen($text)-1); 
	}
	
	$erg = $nn_inhalt;
	
	$nnn_inhalt = implode("
", $nn_inhalt);
	
	fwrite($handle, $nnn_inhalt);
	
	fclose($handle);
	
}

?>

Vielen Danke für eure Antwroten

MFG
 
Ich hab jetzt nicht im Detail deinen code nachvollzogen, da ich kein PHP mache, aber ich würde da die Funktion preg_replace für die Kernfunktionalität verwenden.
Da kannst du saubere regular expressions für die Ersetzung verwenden.

Soll das am ende wirklich eine Webanwendung sein, oder ist das auch nur weil dir PHP vertraut ist? Ansonsten - Auf welchem Betriebssystem soll es laufen?
Ergänzung ()

Mir war nach etwas Bastelei. Daher hier eine kleine Beispiellösung mit unix tools
Code:
cat urls.txt | sed -r 's/^http:\/\/www\.|^http:\/\///' | sed 's/\/ *$//' | sed 's/$/ /' | tr -d '\n' > out.txt

1. Die URLs werden aus urls.txt gelesen
2. http:// oder http://www. am Zeilenanfang werden entfernt
3. / und evtl. darauffolgende Leerzeichen am Zeilenende werden entfernt
4. Ein Leerzeichen am Zeilenende wird eingefügt
5. Die Zeilenumbrüche werden entfernt

urls.txt
Code:
http://www.google.de/
[url]http://www.amazon.de/[/url]
[url]http://ebay.de/[/url]
out.txt
Code:
google.de amazon.de ebay.de

Das geht vielleicht auch eleganter (weniger durchläufe), aber so funktioniert es schonmal.
 
Zuletzt bearbeitet:
Hi,

PHP ist eigentlich die Lösung schlecht hin. Woher hast du denn die Annahme das bei so etwas eine andere Sprache zu verwenden sei?
PHP ist einfach, schnell und elegant. ;)

Allerdings bin ich jetzt verwirrt, einerseits schreibst du einen Zeilenumbruch als Erkennungsmarke von explode, andererseits erzählst du von einem Leerzeichen.

Ich mache das ganze einfach mal mit einem Leerzeichen, im Notfall kannst du es ja ändern ;)

PHP:
<?php

// du solltest die variablen immer prüfen
$pfad = trim($_POST['pfad']);

// is_readable prüft ob datei existiert und lesbar ist
if (is_readable($pfad))
{

  $inhalt = file_get_contents($pfad);
  $inhalt = explode(' ', $inhalt);

  $i = 0;

  // jede variable im array einzeln durchgehen
  foreach ($inhalt as $link)
  {

    // ersetze http:// mit http://www
    if ('http://www' != substr($link, 0, 10))
    {
      $link = str_replace('http://', 'http://www.', $link);
    }

    // lösche slash am ende
    if ('/' == substr($link, strlen($link) - 1, 1))
    {
      $link = substr($link, 0, strlen($link) - 1);
    }

    // variable wieder in das array speichern
    $inhalt[$i] = $link;
    $i++;
  }

  $inhalt = implode(' ', $inhalt);

  // datei schreiben
  if (is_writeable($pfad))
  {
    // öffne datei zum schreiben (leere dabei alte datei)
    $handle = fopen($pfad, 'w');
    fwrite($handle, $inhalt);
    fclose($handle);

    echo 'Datei erfolgreich ge&auml;ndert!';
  } else {

    // auf die datei kann nicht mit Schreib-Rechten zugegriffen werden
    echo 'Kann Datei nicht schreiben, Rechte &uuml;berpr&uuml;ft?';
  }

} else {

  // die Datei konnte nicht gefunden werden
  echo 'Keine Datei vorhanden!';
}

Natürlich könnte man hier noch einige Verfeinerungen einarbeiten, aber ich denke so wirst du für den Anfang mal etwas zum knabbern haben ;)


EDIT: Ich seh gerade, du willst die http://www nicht ersetzt sondern gelöscht haben...
Naja, ich hab's dir bereits vorgemacht, das solltest du mit zwei weiteren if-Abfragen auch schaffen :)
 
Zuletzt bearbeitet: (Siehe EDIT)
Vielen Dank für eure Antworten, ich werd mich morgen mal daran setzen! Das Programm ist nicht fürs Web bestimmt sondern soll mir die Arbeit erleichtern und auf Windows sowie auf Macintosh laufen, Java wäre da eigentlich eine bessere Alternative, aber ich beherrsche es eben nicht ;-).

Ich habe noch eine weitere Frage: Der PHP-Zeilenumbruch "\n" der für HTML-Code als auch für Textdateien gültig bzw. funktioniert?

MFG
 
jopjip schrieb:
Vielen Dank für eure Antworten, ich werd mich morgen mal daran setzen! Das Programm ist nicht fürs Web bestimmt sondern soll mir die Arbeit erleichtern und auf Windows sowie auf Macintosh laufen, Java wäre da eigentlich eine bessere Alternative, aber ich beherrsche es eben nicht ;-).

Ist eigentlich einfach...

Ich habe mal eben eine Brot und Butter Java Implementation gebaut. Du findest sie im Anhang.

Beim Aufruf von der Kommandozeile werden Eingabe- und Ausgabedatei übergeben, also z.B.:
Code:
java -jar URLTransform.jar urls.txt out.txt
 

Anhänge

jopjip schrieb:
Ich habe noch eine weitere Frage: Der PHP-Zeilenumbruch "\n" der für HTML-Code als auch für Textdateien gültig bzw. funktioniert?
Das kommt glaube ich auf den Texteditor an. Notepad bräuchte \r\n, nur mit \n steht alles in einer Zeile.
 
Hi,
ich hatte lange keine Zeit für solche Sachen, jetzt habe ich mich nochmal daran gesetzt und folgenden Code geschrieben:
PHP:
<form action="<? $_SERVER['PHP_SELF'];?>" method="post">

<p>W&auml;hlen&nbsp;Sie&nbsp;eine&nbsp;Datei&nbsp;aus</p>

<input type="file" name="pfad" accept="text/*" />

<br />
<br />

<input type="submit" value="Ausf&uuml;hren" />
<input type="hidden" name="sent" value="1" />
</form>

<?php
if(!(empty($_POST['pfad'])))
{
	
	$handle = file_get_contents(trim($_POST['pfad']));
	
	$handle = explode("\n", $handle);
	
	$i = "0";
	
	$elements = count($handle);
	
	do
	{
		$handle[$i] = str_replace('http://www.', '', $handle[$i]);
		$handle[$i] = str_replace('http://','',$handle[$i]);
		$laenge = strlen($handle[$i]);
		if(substr($handle[$i], $laenge-1, $laenge) == "/")
		{
			$handle[$i] = substr($handle[$i],0, $laenge-1);
		}
		$i++;
	}
	while($i < $elements);
        //Array wird in einen String geschrieben
	$handle = implode("\n",$handle);
        //Datei wird geöffnet und der String gespeichert
	$e = fopen($_POST['pfad'], 'w');
	rewind($e);
	fwrite($e, $handle);
	fclose($e);
}
?>
Das ganze funktioniert auch wunderbar bis es ans öffnen der Datei geht und der String gespeichert werden soll.
Da bekomme ich immer folgende Fehlermeldungen:
Warning: fopen(text.txt) [function.fopen]: failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/ppv-simplify.php on line 71

Warning: rewind() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/ppv-simplify.php on line 72

Warning: fwrite() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/ppv-simplify.php on line 73

Warning: fclose() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/ppv-simplify.php on line 74

Da werde ich wirklich nicht schlau draus, kennt jemand die Lösung? Das ganze wird auf einer XAMPP-Umgebung ausgeführt, daran kann aber auch nicht liegen, denn in einem anderen Programm habe ich dort schon erfolgreich html-Dateien erzeugt, also irgendetwas stimmt mit meinem Code nicht. Ich weiß, man sollte die Varibalen immer prüfen, aber daran kann es meiner Meinung nach nicht liegen, dass irgendwas mit der Datei-Funktion nicht stimmt.

MFG

Edit: Ich habe denselben Code benutzt um eine andere Datei zu überschreiben, woran kann es liegen, dass ich diese bestimmte Datei nicht überschreiben kann? Geschützt ist sie jedenfalls nicht!
 
Zuletzt bearbeitet:
Zurück
Oben