I'm doing search engine for Arabic which should highlight match result in red. Given 2 string:
Keyword: بِسْمِ ٱلرحمن ٱلرحيم ملك
Result: بِسْمِ ٱللَّهِ ٱلرَّحْمَٰنِ ٱلرَّحِيمِ
I want to highlight match words and diacritics on the second string. The first image is the keyword to search, the second image is what I hope to achieve:
In the desired result image, only matched words and "diacritic/dhabt" will be highlighted. I tried to accomplish this with these codes:
var keyword = removeDhabt('بِسْمِ ٱلرحمن ٱلرحيم ملك').split(' ');
var source = 'بِسْمِ ٱللَّهِ ٱلرَّحْمَٰنِ ٱلرَّحِيمِ'.split(' ');
for(var b=0; b<source.length; b++) {
for(var c=0; c<keyword.length; c++) {
if(keyword[c]==removeDhabt(source[b])) source[b] = '<red>'+source[b]+'</red>';
}
}
$(target).html(source);
function removeDhabt(s) {
return s.replace(/ِ/g,'').replace(/ُ/g,'').replace(/ٓ/g,'').replace(/ٰ/g,'').replace(/ْ/g,'').replace(/ٌ/g,'').replace(/ٍ/g,'').replace(/ً/g,'').replace(/ّ/g,'').replace(/َ/g,'');
}
And the result:
Then I split, loop and compare for each character but the result is garbage:
Then I found about zero-width joiner here: Partially colored Arabic word in HTML and after implement the technique, the final result still not 100% accurate:
Here're my final codes and need you help to polish or advice:
var keyword = removeDhabt('بِسْمِ ٱلرحمن ٱلرحيم ملك').split(' ');
var source = 'بِسْمِ ٱللَّهِ ٱلرَّحْمَٰنِ ٱلرَّحِيمِ'.split(' ');
for(var b=0; b<source.length; b++) {
for(var c=0; c<keyword.length; c++) {
if(keyword[c]==removeDhabt(source[b])) {
var newSource = source[b].split('');
var e = 0;
for(var d=0; d<keyword[c].length; d++) {
while(keyword[c][d]!=newSource[e]) e++;
newSource[e] = '<red>'+newSource[e]+'‍</red>';
}
source[b] = newSource.join('');
}
}
}
$(target).html(source);
function removeDhabt(s) {
return s.replace(/ِ/g,'').replace(/ُ/g,'').replace(/ٓ/g,'').replace(/ٰ/g,'').replace(/ْ/g,'').replace(/ٌ/g,'').replace(/ٍ/g,'').replace(/ً/g,'').replace(/ّ/g,'').replace(/َ/g,'');
}
You can collapse your string replacements. For instance:
'test string'.replace(/e|t|n/g,'')
outputs s srig
.
var keyword = removeDhabt('بِسْمِ ٱلرحمن ٱلرحيم ملك').split(' ');
var source = 'بِسْمِ ٱللَّهِ ٱلرَّحْمَٰنِ ٱلرَّحِيمِ'.split(' ');
for(var b=0; b<source.length; b++) {
for(var c=0; c<keyword.length; c++) {
if(keyword[c]==removeDhabt(source[b])) {
var newSource = source[b].split('');
var e = 0;
for(var d=0; d<keyword[c].length; d++) {
while(keyword[c][d]!=newSource[e]) e++;
newSource[e] = '<red>'+newSource[e]+'‍</red>';
}
source[b] = newSource.join('');
}
}
}
$('#target').html(source);
function removeDhabt(s) {
return s.replace(/ِ|ُ|ٓ|ٰ|ْ|ٌ|ٍ|ً|ّ|َ/g,'');
}
body {
font-size: 3em;
}
red {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="target"></div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With