পিএইচপি-তে দুটি স্ট্রিংয়ের মধ্যে পার্থক্য হাইলাইট করার সহজতম উপায় কী?
আমি স্ট্যাক ওভারফ্লো সম্পাদনা ইতিহাস পৃষ্ঠার লাইন ধরে ভাবছি, যেখানে নতুন পাঠ্য সবুজ এবং মুছে ফেলা পাঠ্য লাল। যদি কোনও প্রাক-লিখিত ফাংশন বা ক্লাস উপলব্ধ থাকে তবে তা আদর্শ।
পিএইচপি-তে দুটি স্ট্রিংয়ের মধ্যে পার্থক্য হাইলাইট করার সহজতম উপায় কী?
আমি স্ট্যাক ওভারফ্লো সম্পাদনা ইতিহাস পৃষ্ঠার লাইন ধরে ভাবছি, যেখানে নতুন পাঠ্য সবুজ এবং মুছে ফেলা পাঠ্য লাল। যদি কোনও প্রাক-লিখিত ফাংশন বা ক্লাস উপলব্ধ থাকে তবে তা আদর্শ।
উত্তর:
আপনি পিএইচপি Horde_Text_Diff প্যাকেজটি ব্যবহার করতে সক্ষম হয়েছিলেন।
তবে এই প্যাকেজটি আর উপলব্ধ নেই।
একটি স্ট্রিংকে অন্য স্ট্রিংয়ে রূপান্তর করতে সংক্ষিপ্ত সংখ্যক সম্পাদনা গণনা করতে কেবল একটি ক্লাস লিখেছিলেন:
http://www.raymondhill.net/finediff/
ডিফের এইচটিএমএল সংস্করণটি রেন্ডার করতে এটির একটি স্ট্যাটিক ফাংশন রয়েছে।
এটি প্রথম সংস্করণ, এবং সম্ভবত এটির উন্নতি হতে পারে, তবে এটি এখন ঠিক ঠিক কাজ করে, সুতরাং কারওর জন্য আমার প্রয়োজন মতো দক্ষতার সাথে একটি কমপ্যাক্ট ডিফারেন্ট তৈরির প্রয়োজন হলে আমি এটি সেখানে ফেলে দিচ্ছি।
সম্পাদনা করুন: এটি এখন গিথুবে রয়েছে: https://github.com/gorhill/PHP-FineDiff
আপনি যদি একটি শক্তিশালী গ্রন্থাগার চান তবে পাঠ্য_ডিফ (একটি পিয়ার প্যাকেজ) দেখতে বেশ ভাল লাগছে। এর বেশ কয়েকটি দুর্দান্ত বৈশিষ্ট্য রয়েছে।
এটি একটি চমৎকার এক, হয় http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/
সমস্যাটি সমাধান করা যতটা সহজ মনে হচ্ছে তত সহজ নয় এবং আমি এটি বের করার আগে সমস্যাটি প্রায় এক বছর ধরে আমাকে বিরক্ত করেছিল। আমি 18 লাইনের কোডে পিএইচপিতে আমার অ্যালগরিদম লিখতে সক্ষম হয়েছি। এটি কোনও আলাদা করার সবচেয়ে কার্যকর উপায় নয় তবে এটি বোঝার পক্ষে এটি সবচেয়ে সহজ।
এটি উভয় স্ট্রিংয়ে সাধারণ শব্দের দীর্ঘতম ক্রম সন্ধান করে এবং সাবস্ট্রিংগুলিতে কোনও শব্দের মিল না পাওয়া পর্যন্ত পুনরাবৃত্তভাবে স্ট্রিংয়ের অবশিষ্ট অংশগুলির দীর্ঘতম ক্রম সন্ধান করে কাজ করে। এই সময়ে এটি সন্নিবেশ হিসাবে অবশিষ্ট নতুন শব্দ এবং একটি মুছে ফেলা হিসাবে অবশিষ্ট পুরানো শব্দ যুক্ত করে adds
আপনি উত্সটি এখানে ডাউনলোড করতে পারেন: পিএইচপি সিম্পলডিফ ...
if($matrix[$oindex][$nindex] > $maxlen){
Undefined variable: maxlen
এখানে একটি সংক্ষিপ্ত ফাংশন আপনি দুটি অ্যারে আলাদা করতে ব্যবহার করতে পারেন। এটি এলসিএস অ্যালগরিদম প্রয়োগ করে :
function computeDiff($from, $to)
{
$diffValues = array();
$diffMask = array();
$dm = array();
$n1 = count($from);
$n2 = count($to);
for ($j = -1; $j < $n2; $j++) $dm[-1][$j] = 0;
for ($i = -1; $i < $n1; $i++) $dm[$i][-1] = 0;
for ($i = 0; $i < $n1; $i++)
{
for ($j = 0; $j < $n2; $j++)
{
if ($from[$i] == $to[$j])
{
$ad = $dm[$i - 1][$j - 1];
$dm[$i][$j] = $ad + 1;
}
else
{
$a1 = $dm[$i - 1][$j];
$a2 = $dm[$i][$j - 1];
$dm[$i][$j] = max($a1, $a2);
}
}
}
$i = $n1 - 1;
$j = $n2 - 1;
while (($i > -1) || ($j > -1))
{
if ($j > -1)
{
if ($dm[$i][$j - 1] == $dm[$i][$j])
{
$diffValues[] = $to[$j];
$diffMask[] = 1;
$j--;
continue;
}
}
if ($i > -1)
{
if ($dm[$i - 1][$j] == $dm[$i][$j])
{
$diffValues[] = $from[$i];
$diffMask[] = -1;
$i--;
continue;
}
}
{
$diffValues[] = $from[$i];
$diffMask[] = 0;
$i--;
$j--;
}
}
$diffValues = array_reverse($diffValues);
$diffMask = array_reverse($diffMask);
return array('values' => $diffValues, 'mask' => $diffMask);
}
এটি দুটি অ্যারে তৈরি করে:
আপনি যদি অক্ষরের সাথে কোনও অ্যারে তৈরি করেন তবে এটি ইনলাইন পার্থক্য গণনা করতে ব্যবহার করা যেতে পারে। পার্থক্যগুলি হাইলাইট করার জন্য এখন কেবল একটি পদক্ষেপ:
function diffline($line1, $line2)
{
$diff = computeDiff(str_split($line1), str_split($line2));
$diffval = $diff['values'];
$diffmask = $diff['mask'];
$n = count($diffval);
$pmc = 0;
$result = '';
for ($i = 0; $i < $n; $i++)
{
$mc = $diffmask[$i];
if ($mc != $pmc)
{
switch ($pmc)
{
case -1: $result .= '</del>'; break;
case 1: $result .= '</ins>'; break;
}
switch ($mc)
{
case -1: $result .= '<del>'; break;
case 1: $result .= '<ins>'; break;
}
}
$result .= $diffval[$i];
$pmc = $mc;
}
switch ($pmc)
{
case -1: $result .= '</del>'; break;
case 1: $result .= '</ins>'; break;
}
return $result;
}
যেমন .:
echo diffline('StackOverflow', 'ServerFault')
আউটপুট দেবে:
S<del>tackO</del><ins>er</ins>ver<del>f</del><ins>Fau</ins>l<del>ow</del><ins>t</ins>
এসtackOerverচFaulOwটি
অতিরিক্ত নোট:
computeDiff is not found
এক্সডিফের জন্য একটি পিসিএল এক্সটেনশনও রয়েছে:
নির্দিষ্টভাবে:
পিএইচপি ম্যানুয়াল থেকে উদাহরণ:
<?php
$old_article = file_get_contents('./old_article.txt');
$new_article = $_POST['article'];
$diff = xdiff_string_diff($old_article, $new_article, 1);
if (is_string($diff)) {
echo "Differences between two articles:\n";
echo $diff;
}
পিয়ার-ভিত্তিক এবং দেখানো সহজ বিকল্প উভয়ই নিয়ে আমার ভীষণ সমস্যা হয়েছিল। সুতরাং এখানে এমন একটি সমাধান রয়েছে যা ইউনিক্স ডিফ কমান্ডকে উপকৃত করে (স্পষ্টতই, আপনাকে ইউনিক্স সিস্টেমে থাকতে হবে বা এটির কাজ করার জন্য একটি উইন্ডোজ ডিফ কমান্ড থাকতে হবে)। আপনার পছন্দসই অস্থায়ী ডিরেক্টরি চয়ন করুন এবং যদি আপনি পছন্দ করেন তবে কোডগুলি ফেরত দিতে ব্যতিক্রমগুলি পরিবর্তন করুন।
/**
* @brief Find the difference between two strings, lines assumed to be separated by "\n|
* @param $new string The new string
* @param $old string The old string
* @return string Human-readable output as produced by the Unix diff command,
* or "No changes" if the strings are the same.
* @throws Exception
*/
public static function diff($new, $old) {
$tempdir = '/var/somewhere/tmp'; // Your favourite temporary directory
$oldfile = tempnam($tempdir,'OLD');
$newfile = tempnam($tempdir,'NEW');
if (!@file_put_contents($oldfile,$old)) {
throw new Exception('diff failed to write temporary file: ' .
print_r(error_get_last(),true));
}
if (!@file_put_contents($newfile,$new)) {
throw new Exception('diff failed to write temporary file: ' .
print_r(error_get_last(),true));
}
$answer = array();
$cmd = "diff $newfile $oldfile";
exec($cmd, $answer, $retcode);
unlink($newfile);
unlink($oldfile);
if ($retcode != 1) {
throw new Exception('diff failed with return code ' . $retcode);
}
if (empty($answer)) {
return 'No changes';
} else {
return implode("\n", $answer);
}
}
এটি আমি খুঁজে পেয়েছি সেরা।
$sequence1 = $string1; $sequence2 = $string2; $end1 = strlen($string1) - 1; $end2 = strlen($string2) - 1;
সঙ্গে$sequence1 = preg_split('//u', $string1, -1, PREG_SPLIT_NO_EMPTY); $sequence2 = preg_split('//u', $string2, -1, PREG_SPLIT_NO_EMPTY); $end1 = count($sequence1) - 1; $end2 = count($sequence2) - 1;
আপনি যা খুঁজছেন তা হ'ল একটি "ডিফ ডিগ্রী"। একটি দ্রুত গুগল অনুসন্ধান আমাকে এই সমাধানে নিয়ে গেছে । আমি এটি পরীক্ষা করিনি তবে সম্ভবত এটি আপনার প্রয়োজন অনুযায়ী করবে do
নীল ফ্রেজারের একটি পিএইচপি পোর্ট ডিফার_ম্যাচ_প্যাচ (অ্যাপাচি ২.০ লাইসেন্সযুক্ত)
আমি পিএইচপি কোর থেকে এই দুর্দান্ত কাজগুলি দেখার পরামর্শ দিচ্ছি:
অনুরূপ_পদ্ধতি - দুটি স্ট্রিংয়ের মধ্যে সাদৃশ্য গণনা করুন
http://www.php.net/manual/en/function.similar-text.php
লেভেনস্টেইন - দুটি স্ট্রিংয়ের মধ্যে লেভেনস্টেইনের দূরত্ব গণনা করুন
http://www.php.net/manual/en/function.levenshtein.php
সাউন্ডেক্স - একটি স্ট্রিংয়ের সাউন্ডেক্স কী গণনা করুন
http://www.php.net/manual/en/function.soundex.php
মেটাফোন - একটি স্ট্রিংয়ের মেটাফোন কী গণনা করুন
পাইথন ডিফ্লিবের উপর ভিত্তি করে ক্রিস বোল্টনের এই পিএইচপি ডিফার ক্লাসটি আমি পেয়েছিলাম যা একটি ভাল সমাধান হতে পারে:
আরেকটি সমাধান (সাইড-বাই-সাইড তুলনা জন্য যেমন একটি ইউনিফাইড দৃশ্য উল্টোদিকে): https://github.com/danmysak/side-by-side ।