Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:跳过/删除以开头的行###_Php_File - Fatal编程技术网

PHP:跳过/删除以开头的行###

PHP:跳过/删除以开头的行###,php,file,Php,File,我需要能够跳过文件中以###开头的前20行。(实际上有18行以####开头,两行以;)开头) 我尝试过的每件事都没有跳过同样的两行——我不知道为什么 以下是我尝试过的(这只是我代码的相关部分): 我已经分别尝试了上述三种方法,并将它们结合在一起($line[0]=='.'.''.''.和strpos(trim($line),'.'.'.'))和substr($line,0,1)='.'.''.),但总是跳过同一行(未检测到)。下面是整个标题部分的外观(这是巴比伦词汇表文件(.gls–但为纯文本)

我需要能够跳过文件中以###开头的前20行。(实际上有18行以####开头,两行以;)开头)

我尝试过的每件事都没有跳过同样的两行——我不知道为什么

以下是我尝试过的(这只是我代码的相关部分):

我已经分别尝试了上述三种方法,并将它们结合在一起(
$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 !!!!!!
}