2017-01-21 13 views
1

2つのテキストを比較して異なる単語でハイライト表示するscrpitがありますが、うまくいきません。多くの言葉は、そうでないときには異なるものとしてマークしています。例えば、「その」「など」という言葉は考慮に入れません。また、2つの単語の間にあれば、変更された場合は変更済みとマークされます。私はイメージを添付します。2つのテキストを比較して差分のみを表示

<?php 


$old = 'The one-page order, which Mr. Trump signed in a hastily arranged Oval Office ceremony shortly before departing for the inaugural balls, gave no specifics about which aspects of the law it was targeting. But its broad language gave federal agencies wide latitude to change, delay or waive provisions of the law that they deemed overly costly for insurers, drug makers, doctors, patients or states, suggesting that it could have wide-ranging impact, and essentially allowing the dismantling of the law to begin even before Congress moves to repeal it.'; 


$new = 'The one-page order, which Mr. Trump signed in a unexpectedly organized Oval workplace rite quickly before departing for the inaugural balls, gave no specifics approximately which components of the law it became targeting. But its large language gave federal organizations huge range to exchange, put off or waive provisions of the law that they deemed overly luxurious for insurers, drug makers, docs, sufferers or states, suggesting that it could have wide-ranging effect, and basically permitting the dismantling of the regulation to start even before Congress moves to repeal it.'; 



$oldArr = preg_split('/\s+/', $old);// old (initial) text splitted into words 
$newArr = preg_split('/\s+/', $new);// new text splitted into words 
$resArr = array(); 

$oldCount = count($oldArr)-1; 
$newCount = count($newArr)-1; 

$tmpOld = 0;// marker position for old (initial) string 
$tmpNew = 0;// marker position for new (modified) string 
$end = 0;// do while variable 

// endless do while loop untill specified otherwise 
while($end == 0){ 
// if marker position is less or equal than max count for initial text 
// to make sure we don't overshoot the max lenght 
if($tmpOld <= $oldCount){ 
// we check if current words from both string match, at the current marker positions 
if($oldArr[$tmpOld] === $newArr[$tmpNew]){ 
// if they match, nothing has been modified, we push the word into results and increment both markers 
array_push($resArr,$oldArr[$tmpOld]); 
$tmpOld++; 
$tmpNew++; 
}else{ 
// fi the words don't match, we need to check for recurrence of the searched word in the entire new string 
$foundKey = array_search($oldArr[$tmpOld],$newArr,TRUE); 
// if we find it 
if($foundKey != '' && $foundKey > $tmpNew){ 
// we get all the words from the new string between the current marker and the foundKey exclusive 
// and we place them into results, marking them as new words 
for($p=$tmpNew;$p<$foundKey;$p++){ 
array_push($resArr,'<span class="new-word">'.$newArr[$p].'</span>'); 
} 
// after that, we insert the found word as unmodified 
array_push($resArr,$oldArr[$tmpOld]); 
// and we increment old marker position by 1 
$tmpOld++; 
// and set the new marker position at the found key position, plus one 
$tmpNew = $foundKey+1; 
}else{ 
// if the word wasn't found it means it has been deleted 
// and we need to add ti to results, marked as deleted 
array_push($resArr,'<span class="old-word">'.$oldArr[$tmpOld].'</span>'); 
// and increment the old marker by one 
$tmpOld++; 
} 
} 
}else{ 
$end = 1; 
} 
} 

$textFinal = ''; 
foreach($resArr as $val){ 
$textFinal .= $val.' '; 
} 
echo "<p>".$textFinal."</p>"; 
?> 
<style> 
body { 
background-color: #2A2A2A; 
} 

@font-face { 
font-family: 'Eras Light ITC'; 
font-style: normal; 
font-weight: normal; 
src: local('Eras Light ITC'), url('ERASLGHT.woff') format('woff'); 
} 

p { 
font-family: 'Eras Light ITC', Arial; 
color:white; 
} 

.new-word{background:rgba(1, 255, 133, 0.9);color:black;font-weight: bold;} 
.new-word:after{background:rgba(1, 255, 133, 0.9)} 
.old-word{text-decoration:none; position:relative;background:rgba(215, 40, 40, 0.9);} 
.old-word:after{ 


} 
</style> 

例:彼らが変更されていない場合は、それらの異なる単語をマークしないのはなぜ

Example image result

? よろしく!

答えて

0

私はあなたのコードを検査し、異なるケースを試しました。あなたのアルゴリズムは間違っていると思います。

たとえば、「for」または「the」の代わりに「one-page」と入力すると、「unmatch」のように見えます。これの背後にある理由は、不一致がある場合、すべての配列で一致しない単語を検索しています。そして、指定された単語が既にスキップされている場合(インデックス番号が少ない)、アルゴリズムは失敗します。

これを確認するには、次の変数を使用できます。

$old = 'for costly for insurers.'; 
$new = 'for luxurious for insurers.'; 

この設定では、高価な贅沢な不一致が見つかった場合、コードは次の「for」単語との一致を試みます。しかし、array_search呼び出しは、文字列の先頭に "for"の位置を返します。

$foundKey = array_search($oldArr[$tmpOld],$newArr,TRUE); 

このセクションを改訂して別の方法で検索するようにしてください。 "starting_indices"機能を持つarray_searchをコーディングすることができます。 (または、おそらく配列から正常に一致した要素を解除することができます)

+0

私はフォルトを処理できません。私はブロックされている私はそれを解決する方法を知りません... – JotaMarkes

関連する問題