PHP 按行比较两个文本文件

PHP compare two text files by lines

我需要比较两种语言文件 - 英语和德语。每个文本文件每行有一个 word/phrase。第一语言的 Word/phrase [x] 是第二语言的 word/phrase [x]。译文在第二个文件的同一行。

我尝试使用以下代码获取翻译,但循环似乎不起作用。我总是得到 "none"。有什么想法吗?

function translation($word,$service,$sprache1,$sprache2){
$typus ="transl";
$mypath = "data/".$service."/";

mkdir($mypath,0777,TRUE);

//fh - First language file
$myFile = $mypath."".$typus."-".$sprache1.".txt";
$fh = file($myFile) or die("can't open file");

//fh2 - Second language file

$myFile2 = $mypath."".$typus."-".$sprache2.".txt";
$fh2 = file($myFile2) or die("can't open file");


$x=0;
$result = "none";
foreach ($fh as $line) {


        if (stripos($word,$line))
        {$result = $fh2[$x];
        break;
        } 

$x=$x+1;

            }

return $result;                                                         
}                   

我认为你的问题是错误的 if 陈述。 关键是 stripos(如 strpos)可以 return 0false 作为结果。

例如,如果您在单词 'cats' stripos 中搜索 'cat',则将 return 0,因为它是猫串的第一个位置。 另一方面,如果您在 'cats' stripos 中搜索 'dog' 将 return false 因为没有找到。

所以在你的函数中,if 的情况应该更严格:

if (stripos($word,$line) !== false)

这意味着即使您的单词从位置 0 开始,它也会被找到。 您当前的 if 语句不允许接受 0(零)值。

测试您的代码后,我发现了 2 个不同的问题。

首先要小心stripos。如果在开头(即位置 0)找到 $needle,则此函数 returns 0,如果未找到 $needle,则此函数 false。在 PHP 中,0 默认被评估为 false。 您应该将 if 语句更改为:

if(stripos($word, $line) !== false)

注意 !== 运算符,它比 != 强。

第二个也是最重要的问题会阻止您的函数工作,即您比较的行可能包含不可见字符(例如“newline”字符)。在比较它们之前,您应该 trim 字符串。 我会将您的 if 声明更改为:

if(trim($word) === trim($line))

哪个更简单。或者如果你真的想保留 stripos:

if(stripos(trim($word), trim($line)) !== false)