PHP:跳过/删除以开头的行###
我需要能够跳过文件中以###开头的前20行。(实际上有18行以####开头,两行以;)开头) 我尝试过的每件事都没有跳过同样的两行——我不知道为什么 以下是我尝试过的(这只是我代码的相关部分): 我已经分别尝试了上述三种方法,并将它们结合在一起(PHP:跳过/删除以开头的行###,php,file,Php,File,我需要能够跳过文件中以###开头的前20行。(实际上有18行以####开头,两行以;)开头) 我尝试过的每件事都没有跳过同样的两行——我不知道为什么 以下是我尝试过的(这只是我代码的相关部分): 我已经分别尝试了上述三种方法,并将它们结合在一起($line[0]=='.'.''.''.和strpos(trim($line),'.'.'.'))和substr($line,0,1)='.'.''.),但总是跳过同一行(未检测到)。下面是整个标题部分的外观(这是巴比伦词汇表文件(.gls–但为纯文本)
$line[0]=='.'.''.''.
和strpos(trim($line),'.'.'.'))
和substr($line,0,1)='.'.''.
),但总是跳过同一行(未检测到)。下面是整个标题部分的外观(这是巴比伦词汇表文件(.gls–但为纯文本)的标题
这是我似乎无法摆脱的一句话:
### Glossary id:0265922f91878d6e846e9c869d8a89447c6e719e8585886b8692955f91887a9b8474859a85616a279a929ca07f6881507056895d6881304b5142515f42ba6c992e2b23828188719469656840908429504d595b486965418931312d5b47ad7843525650833a233a47514270695543449f31373b7179484e435a8c428827
我怀疑这是因为这一行很长(或者可能是因为前一行以分号开头?)。我已尝试为在fgets
中读取的每一行指定最大字节长度:
$line = fgets($source_file, 8192);
但这也没用。希望你能帮上忙
整个代码太长,无法放在这里,它已经可以正常工作了——除了去掉这一行
解决方案(基于@Mehdi Bounya的答案)
似乎我没有在正确的位置执行我已经执行的检查。下面的代码正是我所需要的:
elseif($sourceformat == "Babylon") {
if($targetformat == "Wordfast") {
$converted_source_target_delimiter = "\t";
$converted_term_delimiter = "\r\n";
}
$source = trim(fgets($source_file));
if(empty($source)) {
continue;
}
if($source[0] === '#') {
continue;
}
if($source[0] === ';') {
continue;
}
$target = trim(fgets($source_file));
}
$exported_entry = $source.$converted_source_target_delimiter.$target.$converted_term_delimiter;
感谢所有提供帮助的人!您可以使用
fopen
打开文件并循环浏览行,然后只需检查行是否以所需字符开头
此函数采用两个参数,$file
是文件路径,$startWith
是要跳过的字符数组:
function skipLines($file, $startWith = NULL){
$handle = fopen($file, "r");
if ($handle) {
while (($buffer = fgets($handle)) !== false) {
if(in_array($buffer[0], $startWith)){
// Your code if line starts with $startWith
} else {
// Your code if line does not start with $startWith
echo $buffer;
}
}
fclose($handle);
}
}
skipLines("sample.txt", ['#']); // Result 1
skipLines("sample.txt", [';']); // Result 2
skipLines("sample.txt", ['#', ';']); // Result 3
结果1:
; DO NOT EDIT THE NEXT **SIX** LINES - Babylon-Builder generated text !!!!!!
; DO NOT EDIT THE PREVIOUS **SIX** LINES - Babylon-Builder generated text !!!!!!
结果2:
### Glossary title:Cheeseus Muzik
### Author:Cheeseus
### Description:English - Bulgarian and Bulgarian - English glossary of musical terms
### Source language:Bulgarian
### Source alphabet:Cyrillic
### Target language:Bulgarian
### Target alphabet:Cyrillic
### Icon:
### Browsing enabled?Yes
### Type of glossary:00000000
### Case sensitive words?0
### Glossary id:0265922f91878d6e846e9c869d8a89447c6e719e8585886b8692955f91887a9b8474859a85616a279a929ca07f6881507056895d6881304b5142515f42ba6c992e2b23828188719469656840908429504d595b486965418931312d5b47ad7843525650833a233a47514270695543449f31373b7179484e435a8c428827
### Confirmation string:8A148GOK
### File build number:0121DA07
### Build:80"0)2"0
### Glossary settings:00000000
### Gls type:00000001
### Glossary section:
结果3:
// Nothing...
与上面@Mehdi Bounya的回答类似,此代码将所有非“#”行存储到一个数组中。也可以使用substr进行比较
$correct_lines = [];
$handle = fopen("logs.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
if (substr($line, 0, 1) !== "#") {
array_push($correct_lines, $line);
}
}
fclose($handle);
} else {
echo "Error opening the file";
}
foreach ($correct_lines as $line) {
echo $line;
// ; DO NOT EDIT THE NEXT **SIX** LINES - Babylon-Builder generated text !!!!!!
// ; DO NOT EDIT THE PREVIOUS **SIX** LINES - Babylon-Builder generated text !!!!!!
}
您可以使用正则表达式。对于
或
使用字符类[##]
。我尝试了这个方法,不确定是否正确,我真的不知道如何编写正则表达式,从另一篇文章中得到了这样的信息:如果(preg#match#all(“/^#(.$/m)”,$line)){继续;
-但问题仍然存在,所有以和开头的行都被删除了(跳过)除了####Glossary id:..
这一行之外,我实际上也想跳过以分号开头的行。但是对于我已有的代码,它们在某种程度上被跳过了,而没有显式指示。无论如何,您建议的代码与我已有的代码没有什么不同:if($line[0]==='#'){continue;}它不起作用了——同样的两行仍然存在。我创建了一个单独的文件,删除了所有其他代码(与不同的转换格式有关),这样我就可以测试你的建议。它确实起作用,但我也想去掉以分号开头的行。如果($buffer[0]==';'),我想我可以再添加一行if($buffer[0]==';'))
@cheeseus检查更新后的答案,以找到更好的方法来检查多个字符。谢谢@Mehdi Bounya!也不需要以分号开头的行。以#开头的行和以;开头的行都是词汇表标题的一部分。我想删除所有这些行,然后继续阅读实际的词汇表,然后将其删除转换为其他格式。我将编辑我的原始问题,以添加文件的较大部分和我的代码。
// Nothing...
$correct_lines = [];
$handle = fopen("logs.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
if (substr($line, 0, 1) !== "#") {
array_push($correct_lines, $line);
}
}
fclose($handle);
} else {
echo "Error opening the file";
}
foreach ($correct_lines as $line) {
echo $line;
// ; DO NOT EDIT THE NEXT **SIX** LINES - Babylon-Builder generated text !!!!!!
// ; DO NOT EDIT THE PREVIOUS **SIX** LINES - Babylon-Builder generated text !!!!!!
}