2017-11-21 2 views
0

Ich muss eine bestimmte Zeichenfolge aus einer TXT-Datei löschen. Derzeit funktioniert der Code ähnlich, um die Daten direkt in die Datei zu stellen. Der Versuch, die gleichen Daten zu entfernen, die auf die gleiche Weise eingegeben werden, lässt dies jedoch nicht zu. Im aktuellen Zustand sieht der Code zum Entfernen der Zeichenfolge wie folgt aus.PHP: Lösche Zeichenfolge aus der Textdatei

Wir waren NICHT erlaubt prebuilt zu verwenden Sortierfunktionen oder Verwendung Funktionen wie str_replace oder ähnlichen Code.

Hier ist der aktuelle Code für die Zeichenfolge Entfernung:

 $blankReplace = ""; 
     $found = false; 
     $fileData = file($fileInput,FILE_IGNORE_NEW_LINES); 
     for($i = 0; ($i < count($fileData)) && != $found; $i ++) 
     { 
      if($fullNameAndEmail == $fileData[$i]) 
      { 
       $pos = $i; 
       $name = $fileData[$i]; 
       $found = true; 
      } 
     } 
     if($found == true) 
     { 
      // Exit path. Go to for($j = 0) path 
      unset($fileData[$pos]); 
      shuffle($fileData); 
     } 
     else 
     { 
      //Error Msg 
     } 
     $writeToFile = fopen($inputFile,'w+'); 
     for($j = 0;$j<count($fileData);$j++) 
     { 
       if(trim($fileData[$j]) != " ") 
       { 
        $rewrittenList = trim($fileData[$j])."\n"; 
        fwrite($writeToFile, $rewrittenList); 


       } 
     } 

Der Code ausgibt, einen Fehler von T_IS_NOT_EQUAL in Code auf den Fehler zu erforschen. Die Daten kommen als direkte Daten aus der Datei() gelesen, also sollte es funktionieren. Der Fehler zeigt derzeit auf Zeile for($i = 0; ($i < count($fileData)) && != $found; $i ++), verweist aber wahrscheinlich auch auf ein ähnliches Vorkommen im Code.

Die Daten werden im Format eingegeben:

firstname lastname emailaddress 

Ich muss in der Lage zu handhaben auch, wenn mehrere Instanzen des genannten Namen so auftreten sagen, wir haben: Wille

Matt Person [email protected] 
Matt Person [email protected] 

Dass es Löschen Sie eine Instanz und nicht alle in ähnlichen Fällen.

Jede Hilfe wird geschätzt, Vielen Dank für Ihre Zeit im Voraus.

EDIT:

Example input: 
Matthew person [email protected] 
John holton [email protected] 
Person Name [email protected] 

Der Benutzer Eingabe des Namens einer Person (im Format oben), und es wird bei der Entfernung von einer Person zur Folge haben. Sagen, dass sie Eingang in die Form:

$fullName = "Matthew person"; 
$emailAddr = "[email protected]"; 
The output will edit the data to put the data into a single line again 
$fullNameAndEmail = $firstName." ".$lastName." ".$emailAddr; 

Der Ausgang des Codes, wird in diesem Beispiel entfernen "Matthew Person [email protected]"

So ist die Ausgabe in der Textdatei folgende Ausgabe:

John holton [email protected] 
Person Name [email protected] 

Edit 2: Code in seiner aktuellen Zustand

<!doctype HTML> 
<html> 
<meta charset="utf-8"> 
<head> 
<title>Updating the guest book!</title> 
</head> 

<body> 
<?php 


$fileInput = "guestBook.txt"; 
$fileInputInData = file_get_contents($fileInput); // Gets data from file 
$testBool = file_exists($fileInput); 
$fullName = trim($_POST["fullName"]); 
$emailAddr = trim($_POST["emailAddr"]); 
$fileSize = filesize($fileInput); 

if(!empty($fullName) and !empty($emailAddr)) 
{ 
    if($testBool == 0) 
    { 
     echo "There was an issue with the file. Please have it checked.</br>"; 
    } 
    else 
    { 
     echo "Made it into else path for testBool </br>"; 
     if($fileSize > 0) 
     { #code for truth 
      echo "Made it into filesize check. Filesize: $fileSize </br>"; 


      $fullNameLen = strlen($fullName); 
      $emailAddrLen = strlen($emailAddr); 
      $fullNameArr = explode(" ", $fullName); 
      $firstName = trim($fullNameArr[0]); 
      $lastName = trim($fullNameArr[1]); 
      $fullNameToWrite =$firstName." ".$lastName; 
      $emailAddrCheck=substr_count($emailAddr, "@"); 
      if ($emailAddrCheck == 1) 
      { 
       echo "Email address check passed</br>"; 
       #email addr entered right path 
       $fullNameAndEmail =$fullNameToWrite." ".$emailAddr." has signed in.\n"; 
       $inputFile = "guestBook.txt"; 
       //$pos = strpos($writeToFile, $fullNameAndEmail); 
       //$writeToFileEx = explode("\n", $fileInputInData); 
       $blankReplace = ""; 
       $str = $fileInputInData; 
       $find = $fullNameAndEmail; 
       $arr=explode("\n", $str); 
       Foreach($arr as $key => &$line) 
       { 
        If($line == $find) 
        { 
         Unset($arr[$key]); 
         shuffle($arr); 
        } 
       } 
       $writeToFile = fopen($inputFile,'w+'); 
       $rewrittenList = trim($arr)."\n"; 
       fwrite($writeToFile, $rewrittenList); 
       fclose($inputFile); 
      } 
      else   { 
       echo "Email address check failed. Invalid email address entered. </br> 
         Line 55 occured.</br>"; 
       #email addr entered wrong message 
      } 
       //asort(array) sorts array low to high (ascending) 
       //arsort(array) sorts array high to low (descending) 

     } 
     else 
     { 
      echo "Did not make it into filesize check. Filesize: $fileSize. Line 63 occured </br>"; 
     } 
    } 
} 
else if (empty($fullName) or empty($emailAddr)) 
{ 
    echo "Error! Line 23: One of the inputs was left empty. Line 69 occured </br>"; 
} 
else 
{ 
    echo "Error! Line 23: Did not detect any values in either data area,</br>and program 
    did not go into first error. Line 73 occured </br>"; 
} 

?> 
<br> 
</body> 
</html> 
+0

zu starten:! '= $ Found' sollte' $ found' im 'for' Schleife Sie erwähnen. Derzeit ist es ein Syntaxfehler – dan08

+0

Zeigen Sie uns Eingänge und Ausgänge. Sie haben alles außer den Eingängen und der erwarteten Ausgabe der Funktion erläutert. Was ist '$ fullNameAndEmail' – Andreas

+0

Versuchen Sie str_replace neu zu erfinden? https: // 3v4l.org/gpTEg # vhhvm-3185 – Andreas

Antwort

0

ich glaube, Sie es zu kompliziert sind.
Ich foreach jede Zeile und prüfen, ob es übereinstimmt.
Wenn dies der Fall ist, die Zeile deaktivieren.

Nach der Schleife implodiere ich auf neue Zeile und die Zeichenfolge ist wieder normal, aber ohne die $ finds.

$str = "Matt Person [email protected] 
John doe [email protected] 
Matt Person [email protected] 
Trump [email protected]"; 

$find = "Matt Person [email protected]"; 

$arr=explode("\n", $str); 

Foreach($arr as $key => &$line){ 

    If($line == $find){ 
     Unset($arr[$key]); 
    } 
} 
Echo implode("\n", $arr); 

https://3v4l.org/hmSr7

+0

Der Versuch, Werte in den Ergebnissen zu testen, in dem Inhalt der Datei leider gelöscht wird. Ich habe versucht, einen String-Satz von einem file_get_contents-Anfang zu setzen, um die zu suchenden Daten anzuzeigen. Dies wurde in $ str = $ Variable platziert, wobei $ variable dort steht, wo es gespeichert ist. Wenn Sie den vollständigen String ($ fullNameAndEmail) in $ find eingeben, wird der gesamte Inhalt der Textdatei entfernt. Haben Sie eine Lösung? Der Inhalt von $ arr wird anschließend in die Datei zurückgeschrieben. –

+0

Um zu zeigen, was ich meine: $ str = $ fileInputInData; \t \t \t \t $ find = $ fullNameAndEmail; \t \t \t \t $ arr = explodieren ("\ n", $ str); \t \t \t \t foreach ($ arr als Schlüssel $ => & $ line) \t \t \t \t { \t \t \t \t If ($ line == $ find) \t \t \t \t { \t \t \t \t Unset ($ arr [$ key]); \t \t \t \t shuffle ($ arr); \t \t \t \t} \t \t \t \t} \t \t \t \t $ writeToFile = fopen ($ inputfile 'w +'); \t \t \t \t $ rewrittenList = trimmen ($ arr). "\ N"; \t \t \t \t fwrite ($ writeToFile, $ rewrittenList); –

+0

Sie haben uns noch keine Eingabe und erwartete Ausgabe gezeigt. Es funktioniert für die Daten, die ich zur Verfügung stelle. Wenn deine Daten so weit von mir entfernt sind, musst du sie zeigen **. Sonst kann ich (wir) Ihnen nicht helfen – Andreas

Verwandte Themen