Не могу найти подходящую функцию для замены определённых вхождений.
К примеру есть строка: "Наша Таня громко плачет, уронила в речку мячик."
Задача стоит следующая, при каждом выполнении программы, скрипт должен находить все буквы "а" и заменять их на английскую "a". Причем не во всех сразу, а каждый раз в разных словах.
Я вижу выполнение задачи следующим образом:
При каждом выполнении программы, скрипт должен определять количество вхождений буквы "а", с помощью функции rand() получать случайное число в приделе количества найденных вхождений. И с помощью функции которую я ищу если она существует, заменять русские буквы на английские в приделе вхождений определённых через функцию rand().
Вот например в тексте для примера:
Представим что при первом выполнении скрипта в нашей строке найдено 5 вхождений. Функция rand(0, 5) - получает число 3. Значит мы изменяем только первые 3 буквы "а". И тогда текст получается уже такой:
"Нaшa Тaня громко плачет, уронила в речку мячик."
При следующем выполнении rand(0, 5) - получает число 5. И тогда текст получается уже такой:
"Нaшa Тaня громко плaчет, уронилa в речку мячик."
Ну и конце в концов нужно что бы не только букву "а" изменял но и "с,е,о и возможно и".
Подскажите пожалуйста, есть ли такая функция или как реализовать подобный скрипт.
Вопрос оформлен доступно, побольше бы таких...
1) 2 массива можно объединить в один, где ключи - русские символы, значение - английские.
2) Вместо for
можно использовать foreach
по тому самому массиву.
3) Цикл for
с preg_replace
не нужен, ибо последний параметр соответствует количеству замен и он равен $rand
.
4) В целях оптимизации, можно не запускать цикл с заменой, если замен 0.
Из выше перечисленного теперь код будет выглядеть так:
$string = "Наша Таня громко плачет, уронила в речку мячик.";
$symbol_array = array(
"а" => 'a',
"с" => 'c',
"е" => 'e',
"о" => '0'
);
foreach ($symbol_array as $symbol_array_key => $symbol_array_value) {
$rand = rand(0, substr_count($string, $symbol_array_key));
if ($rand > 0) {
$string = preg_replace("/" . $symbol_array_key . "/", $symbol_array_value, $string, $rand);
}
}
echo $string;
Наверняка найдется более элегантный и правильный код, но вот как мне удалось решить данный вопрос самостоятельно.
#Исходный текст.
$string = "Наша Таня громко плачет, уронила в речку мячик.";
#Массив с русскими буквами.
$symbol_ru = array(
"а",
"с",
"е",
"о"
);
#Массив с английскими буквами.
$symbol_en = array(
"a",
"c",
"e",
"o"
);
#Создаём цикл и выводим буквы из массива.
for ($i = 0; $i <= count($symbol_ru); $i++) {
#Считаем количество найденных букв в исходном тексте.
$substr_count = substr_count($string, $symbol_ru[$i]);
#Создаём случаное число в приделе найденных букв.
$rand = rand(0, $substr_count);
#Создаём цикл, с количество повторений полученных в $rand.
for ($j = 0; $j <= $rand; $j++) {
#Ищем первое вхождение и заменяем на английскую букву.
$string = preg_replace("/" . $symbol_ru[$i] . "/", $symbol_en[$i], $string, 1);
}
}
#Выводим результат.
echo $string;
Я так думаю что с массивами можно по другому поступить, но не уверен. Если вы знаете как улучшить данный код, буду рад если вы укажете как. Всем мир.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Хочу спарсить цену на ETH и BTC с кмк, но почему-то цена выводится 1 раз, только на биток или эфир, как оптимизировать скрипт?
я ищу способ добавления элемента в родительскийСтруктура xml документа такова: