Remove line from end of file with PHP - php

How would I remove a line from the end of a string with PHP? Thanks.

You want to remove whitespace? Try trim(). It's close cousins ltrim and rtrim may be closer to what you want.

If you are looking to remove the last line is a string containing new line character (\n), then you'd do something like this ...
$someString = "This is a test\nAnd Another Test\nAnd another test.";
echo "SomeString BEFORE=".$someString."\n";
// find the position of the last occurrence of a \n
$firstN = strlen($someString) - strpos(strrev($someString), "\n");
// get rid of the last line
$someString = substr($someString, 0, $firstN);
echo "SomeString AFTER=".$someString;

if you're trying to remove a line from an end of a file, you could try using PHP's file() function to read the file (which places it into an array) and then pop the last element. This is assuming that php is recognizing the line endings in your file.

$subject = 'Text
written
with
lines';
echo preg_replace('/\\n[^\\n]*\\n?$/', '', $subject);
With feature, that there can be one special newline at the end which is ignored, 'cause it is often a good convention to let one at the end of a file (assuming you are reading string from a file).

Related

Remove lines with specific pattern at the beginning of them

I have a text file of approximately 25,000 lines. About 525kb.
Some lines have random text at the beginning.
Some have long strings of semicolons.
Some others only have three semi-colons and then a space and optionally more text on the same line. These are the lines I want to remove.
Here is a sample....
;;; Updated Time 20120706122706
;;; Generic DEveloper Output
;;; Some Random Comments
;;; I got some more...
;;; Yet another uneeded line
;;; Thanks for using StackOverflow <http://stackoverflow.com>, or...
;;; Not.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Banana Production
[Data_Release_Version]
Version=12586
Released=20120706122706
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baseline Properties
[BaseLineProperties]
Comment=BaselineProperties
----- and so on.
Once it gets to the first line with 4 or more ; on the line, I need the rest of the file as there are no ";;; " lines.
Trying to find something fast instead of reading everything line and writing it back out if it doesn't match ";;; ".
File is ASCII (possibly UTF-8) text type file.
Any ideas?
Thank you for your time, assistance and knowledge.
What I would suggest is to use file_get_contents() and save file's contents in a variable as a string, then use explode() that string at every newline character, then in a foreach loop, use preg_match() to check if the line begins with 3 semicolons and a space, if it dosent, put it in another array named $output. After foreach, implode() $output and add a newline character and use file_put_contents() to print it in another file. Hope this helps :-)
code:
<?php
$string = file_get_contents($filename);
$array = explode("\n",$string);
foreach($array as $arr) {
if(!(preg_match("^;;;\s",$arr))) {
$output[] = $arr;
}
}
$out = implode("\n",$output);
file_put_contents($path,$out);
?>
Depends.. I would try to load into a string, then do a explode() with newline, so it's in array, then run a foreach with a skip on any that doesnt have strpos == 0 -AND- strpos !== false, you can put in a continue to skip to the next line if it doesnt match.
Another option, is to parse, and skip, or even using fseek, and such. Depends on alot of different factors to determine whats going to be fastest.
You can implode later on, and add the newlines back in, and then push out a file, and/or use line breaks. Depending where the output is supposed to go.
I think you gave the answer yourself:
Make a script that reads the input file line by line in a loop (while). It writes every line into an output file if two conditions are met: 1. a flag ("done") is FALSE and 2. the line does NOT start with ";;; " (not the blank). This removes those lines starting with three semicolons. Once you come about a line containing more semicolons you set the flag to TRUE, thus the remaining lines wil be copied without being examined.

Newline inside variable string

What if I have a long input of string? maybe 50-250 characters.
and I echoed the variable it would echo a very long line of letters and words.
So, how will I let the variable auto Newline itself? maybe after 50 characters it would new line when echoed.
I have thought of counting the length of the string and looping it and after counting 50 characters it would Newline but if i do that it would slow down the Site.
is there any function to Newline a VARIABLE STRING? or i should use Looping instead?
You can use a built-in PHP function: wordwrap.
If you want to cut at 50 characters and insert a HTML line-break:
wordrap($str, 50, "<br />");
You can also use the last parameter to force return, even if the string does not contain spaces.
You can insert escape characters into a string, such as \n which will be translated to a new line break.
You can use PHP_EOL in conjunction with strlen() to acheive what you want.
Just adding more info about \n:
// PHP 5.5.12
// This works for outputing to browser:
$XmlHeader = '<?mso-application progid="Excel.Sheet"?>' . "\n";
// These do NOT work:
$XmlHeader = '<?mso-application progid="Excel.Sheet"?>' . '\n';
$XmlHeader = '<?mso-application progid="Excel.Sheet"?>\n';
If you can manage the string in php i think the definitive solution is using function wordwrap: http://www.php.net/manual/en/function.wordwrap.php
You can set the max lenght of a row, the braek parameter (in your case /n).
The function returns a string with the /n breaks and you can print it.

imagettftext \\n line break puzzle

in PHP imagettftext, should I be able to make line breaks with "\n" in a string like this?
// The text to draw
$text = 'Something\nElse';
When I try this, the text outputted reads "Something\\nElse" with 2 back slashes before the n.
This does not result in a line-break.
Firstly, SHOULD a single slash n make a line break (\n)?
Secondly, How do i get it to work?
Thanks
\n is a line break only when the string is delimited with double quotes.
echo 'Something\nElse'; // outputs Something\nElse
echo "Something\nElse"; // outputs Something
// Else

php, file character

Is there way to replace last charcter in each line within file using php?
I have file that has bunch of lines and at the end of each line there is a character that I need to remove.
Do I have to read file line by line or is there magic that I can use to strip last character in each line of a file?
How would I do that?
Any help is appreciated.
You are going to have to read in each line and edit each line with. What OS are you using? Unix has some useful tools (awk, sed) for this type of problem.
Is the character the same character every time? You can load your file into a string using
$mystr = file_get_contents("myfile.txt");
and then use preg_replace to remove your character from the string.
$mystr = preg_replace("yourcharhere","",$mystr);
and then put your string back into the file
$fh = fopen("myfile.txt", 'w');
fwrite($fh, $stringData);
fclose($fh);
You can also add yourcharacterhere+newline in the preg_replace and then cahnge the "" to a newline. That will make it so it only removes your character before a newline. If you have different characters you need to remove, you can use a regular expression and a wildcard to remove any character before a newline.
You would either have to read the file line by line, or load the entire file and then explode it by a linebreak and then loop through that (essentially the same).

file_put_contents, file_append and line breaks

I'm writing a PHP script that adds numbers into a text file. I want to have one number on every line, like this:
1
5
8
12
If I use file_put_contents($filename, $commentnumber, FILE_APPEND), the result looks like:
15812
If I add a line break like file_put_contents($filename, $commentnumber . "\n", FILE_APPEND), spaces are added after each number and one empty line at the end (underscore represents spaces):
1_
5_
8_
12_
_
_
How do I get that function to add the numbers the way I want, without spaces?
Did you tried with PHP EOL constant?
file_put_contents($filename, $commentnumber . PHP_EOL, FILE_APPEND)
--- Added ---
I just realize that my file editor does the same, but don't worrie, is just a ghost character that the editor places there to signal that there is a newline
You could try this
A file with EOL after the last number looks like:
1_
2_
3_
EOF
but a file without that last character looks like
1_
2_
3
EOF
where _ means a space character
You could try to parse the file contents using php to see what's inside
$lines = explode( PHP_EOL, file_get_contents($file));
foreach($lines as $line ) {
var_dump($line);
}
...tricky
pauls answer has the correct approach but he has a mistake.
what you need ist the following:
file_put_contents($filename, trim($commentnumber).PHP_EOL, FILE_APPEND);
the PHP_EOL constant makes sure to use the right line ending on mac, windows and unix systems
the trim function removes any newline or whitespace on both sides of the string.
converting to integer would be a huge mistake because
1. you might end up having zero, expecially because of white space or special characters (wherever they come from...)
2. ids dont necessarily need to be integers
Ohh Guys! Just Use
\r\n
insted of \n
There is nothing in the code you provided that would generate those spaces, unless $commentnumber already contains the space to begin with. If that is the case, simply use trim($commentnumber) instead.
There is also nothing in your code that would explain empty lines at the bottom of the file, unless $commentnumber can be an empty string. If that is the case, and you want it to output the number 0 instead, use intval($commentnumber).
Of course, you need only one of those two. If you want to preserve string-like content, use trim(); if you always want integers, use intval(), which already trims it automatically.
It is also possible that you accidentally wrote " \n" instead of "\n" in your actual code, but in the code you posted here it is correct.
annoyingregistration, what you have there is absolutely fine.
PHP_EOL and "\n" are exactly the same.
The code you provided theres nothing wrong with it so it must be the value of $commentnumber that has a space at the end of it. as stated, run your $commentnumber through the trim() function.
file_put_contents($filename, trim($commentnumber . "\n"), FILE_APPEND);
Good luck.
After reading your code and responses, I have come up with a theory...
Since I can't see that there's anything wrong with your code, how did you open and read the file? Did you actually open it in a text editor? Did you use a PHP script to do it? If so, open the file with a text editor and check that there are actually spaces at the end of each line. If there is actually is...well, ignore the rest of this answer, then. If not, just read on.
For instance, if you use something like this:
<?php
$lines = file($filename);
if($lines) // Error reading
die();
foreach($lines as $line)
echo $line."<br />";
Then you would always a whitespace at the end of the line because of the way file() work. Make sure each $line does not have a whitespace - such as a newline character - at the end.
Since HTML handles all whitespaces - spaces, tabs, newlines etc. - as spaces, if there is a whitespace at the end of $line, then those would appear as spaces in the HTML output.
Solution: use rtrim($line) to remove whitespaces at the end of the lines. Using the following code:
<?php
$lines = file($filename);
if($lines) // Error reading
die();
foreach($lines as $line)
echo rtrim($line)."<br />";
wouldn't have the same problems as the first example, and all spaces at the end of the lines would be gone.
its because each time you write to the file, the file is being finished, file_put_contents inserts an extra line break at the end

Categories