Asked thg 12 20, 2021 10:53 SA 239 0 2
  • 239 0 2
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 :(

Share
  • 239 0 2

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! ✌️

2 ANSWERS


Answered thg 12 21, 2021 1:22 SA
Accepted
+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ý.

Share
thg 12 21, 2021 1:46 SA

Em thấy chạy ngon rồiiii =))))) Cảm ơn anh zai nhé! ✌️

0
| Reply
Share
Answered thg 12 21, 2021 1:29 SA
+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

Share
thg 12 21, 2021 1:47 SA

Bác lại thông não cho em ✌️ respect!

+1
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.