0

テキストの文を取得し、特定の単語を太字にする単純な PHP コードがあります。

まず、必要な単語とテキスト内での位置を含む配列を取得します。

$all_words = str_word_count($text, 2, 'åæéø');

// $words is an array with the words that I want find.
$words_found = array();
foreach ($all_words as $pos => $word_found) {
  foreach ($words as $word) {
    if ($word == strtolower($word_found)) {
      $words_found[$pos] = $word_found;
      break;
    }
  }
}

次に、単語ごとに$words_found、その単語が中央にあるテキストの一部を取得します。

$length = 90;
foreach ($words_found as $offset => $word) {
  $word_length = strlen($word);

  $start = $offset - $length;
  $last_start = $start + $length + $word_length;

  $first_part = substr($text, $start, $length);
  $last_part = substr($text, $last_start, $length);

  $sentence = $first_part . '<b>' . $word . '</b>' . $last_part;
}

UTF-8テキストがデンマーク文字 (åæéø)のテキストであることを除いて、問題なく動作します。したがって、$first_partまたは$last_partがユニコード文字で始まる場合、susbtr 文字列は空になります。

私はmb_substr機能を知っているので、コードをそれに置き換えます。

$word_length = mb_strlen($word, 'UTF-8');
$first_part = mb_substr($text, $start, $length, 'UTF-8');
$last_part = mb_substr($text, $last_start, $length, 'UTF-8');

しかし、この関数 ( mb_substr) では、単語 ( $offset) の位置が間違っているため、新しい部分文字列 ( $sentence) が一致する必要があります。

のようなものは存在しますmb_str_word_countか?単語の正しい位置を取得するにはどうすればよいですか?

4

2 に答える 2

1

@Mario Johnathan による解決策を試してみましたが、うまくいきませんでした。

最後に、私は自分で解決策を取得します。非マルチバイト関数のようなsubstrと で指定された位置を使用しstr_word_count、最初の文字がデンマーク文字の場合、解決策は最初の部分文字列を変更します。

$first_part_aux = str_split(trim($first_part));

if (!ctype_alpha($first_part_aux[0])) {
  for ($i = 1; $i < count($first_part_aux); $i++) {
    if (ctype_alpha($first_part_aux[$i])) {
      $start = $start + $i;
      $length = $length - $i;

      $first_part = substr($text, $start, $length);

      break;
    }
  }
}
于 2014-02-05T12:25:14.983 に答える