Как вставить символ в слово, сохраняя регистр - PullRequest
1 голос
/ 14 апреля 2019

Я хочу вставить символ внутри слова в строке, если при сохранении регистра найдено совпадение. Этот код работает нормально, но я должен указать результирующее слово.

$string = "Quick brown fOx jumps right over the lazy dog.";
$swears = array(
    "BROWN" => "BRO.WN",
    "fox"  => "f.ox",
    "Dog"  => "D.og",
);
$filtered = str_ireplace(array_keys($swears), array_values($swears), $string);

Проблема с этим кодом в том, что любой "коричневый" становится BRO.WN Можно ли вставить символ, если слово совпадает. Как Браун становится Bro.wn; при сохранении дела коричневый становится браун.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

Возможно, есть гораздо лучшие способы сделать это, но вот единственный ответ, который я придумал:

 foreach($swears as $swear => $modified_swear) {
   $swear_pos = stripos($string, $swear);
   if($swear_pos !== false) {
     $swear_len = strlen($swear);
     if($swear_len >= 3) {
       $new_string = substr($string, 0, $swear_pos);
       $new_string .= substr($string, $swear_pos, $swear_len-2);
       $new_string .= '.';
       $new_string .= substr($string, $swear_pos+($swear_len-2));
       $string = $new_string;
     }
   }
}

Этот код работает, только если вы на самом деле пытались добавить одну точку перед двумя последними символами ругательства.

РЕДАКТИРОВАТЬ:

Новый код, который может изменять все вхождения списка слов.

    $searched_pattern = '/\b(?:';
foreach($swears as $swear => $modified_swear) {
  $searched_pattern .= '('.$swear.')|';
}
$searched_pattern = rtrim($searched_pattern, '|');
$searched_pattern .= ')\b/i';

$string = preg_replace_callback(
  $searched_pattern,
  function($matches) {
    $word = $matches[0];
    $swear_len = strlen($word);
    if($swear_len >= 3) {
      $new_word .= substr($word, 0, $swear_len-2);
      $new_word .= '.';
      $new_word .= substr($word, $swear_len-2);
      $word = $new_word;
    }
    return $word;
  },
  $string
);
0 голосов
/ 14 апреля 2019

Мне не совсем понятно, что вы хотите? Есть альтернативы для этого теста. Затем выполните str_replace, вставив символ в определенную позицию.

   <?php
$string = "Quick brown fOx jumps right over the lazy dog.";
$swears = array(
    "BROWN" => "BRO.WN",
    "fox"  => "f.ox",
    "Dog"  => "D.og"
);
$string_arr = explode(" ",$string);
    $swears_arr = array_keys($swears);
    foreach ($swears as $swear_key => $swear_word) {
    foreach ($string_arr as $key => $word) {
        if (preg_replace('/[^a-z]+/i', '', strtolower($word)) == strtolower($swear_key)) {
             $string_arr[$key] = substr_replace($word, '.', 1, 0);
                                 }
                                            } 
                                                   }

    // put the sentence back together:

    $new_string = implode(" ",$string_arr);
print_r($new_string);
    ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...