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 0 或 false 作为结果。
例如,如果您在单词 '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)
我需要比较两种语言文件 - 英语和德语。每个文本文件每行有一个 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 0 或 false 作为结果。
例如,如果您在单词 '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)