0
[PHP] Xử lý chuỗi tiếng nhật. Tìm kiếm với từ Hira (ころな) thực hiện hightlight từ Katakana (コロナ) của đoạn văn :(
Em chào mn, Đợt này em phải thao tác với chuỗi nhật mà hoa mắt quá Em đang thực hiện đoạn code này mà không nhận, có cao nhân nào giúp em phát! Em cảm ơn ạ.
class SearchResultHighlighter
{
//------------------------------------------------------------------------------------------
public $term_to_highlight;
protected $term_len;
protected static $transliterator = null;
//------------------------------------------------------------------------------------------
public function __construct(
$term_to_highlight, // must be an already transliterated search term (ASCII only)
$transliterator_rules // rules passed to Transliterator::createFromRules
) {
$this->term_to_highlight = $term_to_highlight;
$this->term_len = mb_strlen($this->term_to_highlight);
if (self::$transliterator === null) // Transliterator only available PHP >= 5.4.0, PECL intl >= 2.0.0
self::$transliterator = class_exists('Transliterator') ? Transliterator::createFromRules($transliterator_rules) : null;
}
//------------------------------------------------------------------------------------------
public function highlight(
$html, // the HTML in which to highlight all occurrences of $this->term_to_highlight
$css_class = 'hl' // the CSS class used to highlight occurrences
) {
if (self::$transliterator === null)
return $html;
$result = '';
$source_len = mb_strlen($html);
$matched_term_chars = 0;
$source_match_startpos = 0;
$source_match_len = 0;
for ($i = 0; $i < $source_len; $i++) {
$c = mb_substr($html, $i, 1);
$c_trans = mb_strtolower(self::$transliterator->transliterate($c));
$c_trans_len = mb_strlen($c_trans); // note: single transliterated chars can be more than one char, e.g. transliterate('手') yields 'shou'
if ($c_trans_len <= $this->term_len - $matched_term_chars && $c_trans === mb_substr($this->term_to_highlight, $matched_term_chars, $c_trans_len)) {
if ($matched_term_chars == 0)
$source_match_startpos = $i;
$matched_term_chars += $c_trans_len;
$source_match_len++;
if ($matched_term_chars == $this->term_len) {
$result .= sprintf('<span class="%s">%s</span>', $css_class, mb_substr($html, $source_match_startpos, $source_match_len));
$matched_term_chars = $source_match_len = 0;
}
} else {
$result .= $source_match_len > 0 ? mb_substr($html, $source_match_startpos, $source_match_len + 1) : $c;
$matched_term_chars = $source_match_startpos = $source_match_len = 0;
}
}
return $result;
}
}
$html = '<p>新型コロナの影響を大きく受けているスポーツ界123。新たな変異株が現れる中で先行きは不透明です。声を出して応援できずファンの思いも複雑なままです。でも、こんな時だからこそひいきのチームを支えよう!応援は力になっています。(ネットワーク報道部記者・松本裕樹)</p>';
$transliteration_rules = ':: Hiragana-Katakana;';
$highlighter = new SearchResultHighlighter('ころな', $transliteration_rules);
var_dump($highlighter);
echo $highlighter->highlight($html, 'yellow-bold');
Cảm ơn bác nào đọc hết đoạn code này!
Add a comment
2 ANSWERS
+1
function highlightString($searchString, $html){
$searchStringKana = mb_convert_kana($searchString, 'C');
$result = str_replace($searchString,'<b>'.$searchString.'</b>', $html);
$result = str_replace($searchStringKana,'<b>'.$searchStringKana.'</b>', $result);
return $result;
}
$html = '<p>新型コロナの影響を大きく受けているスポーツ界123。新たなころな変異株が現れる中で先行きは不透明です。声を出して応援できずファンの思いも複雑なままです。でも、こんな時だからこそひいきのチームを支えよう!応援は力になっています。(ネットワーク報道部記者・松本裕樹)</p>';
echo highlightString('ころな', $html);
Bạn tham khảo code phía trên rồi bỏ vào class của bạn cho hợp lý.
Em thấy chạy ngon rồiiii =))))) Cảm ơn anh zai nhé!
+2
Vấn đề trong code của bạn là bạn chưa convert từ hira -> kata
Nên lúc tìm kiếm mb_substr($this->term_to_highlight, $matched_term_chars, $c_trans_len) sẽ không trả về kết quả.
Trong hàm khởi tạo bạn thay đổi $this->term_to_highlight = $term_to_highlight; thành $this->term_to_highlight = mb_convert_kana($term_to_highlight, 'C'); thì code của bạn sẽ chạy được
Bác lại thông não cho em respect!