Замена определённых вхождений php

172
01 февраля 2020, 17:40

Не могу найти подходящую функцию для замены определённых вхождений.

К примеру есть строка: "Наша Таня громко плачет, уронила в речку мячик."

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

Я вижу выполнение задачи следующим образом:

При каждом выполнении программы, скрипт должен определять количество вхождений буквы "а", с помощью функции rand() получать случайное число в приделе количества найденных вхождений. И с помощью функции которую я ищу если она существует, заменять русские буквы на английские в приделе вхождений определённых через функцию rand().

Вот например в тексте для примера:

Представим что при первом выполнении скрипта в нашей строке найдено 5 вхождений. Функция rand(0, 5) - получает число 3. Значит мы изменяем только первые 3 буквы "а". И тогда текст получается уже такой:

"Нaшa Тaня громко плачет, уронила в речку мячик."

При следующем выполнении rand(0, 5) - получает число 5. И тогда текст получается уже такой:

"Нaшa Тaня громко плaчет, уронилa в речку мячик."

Ну и конце в концов нужно что бы не только букву "а" изменял но и "с,е,о и возможно и".

Подскажите пожалуйста, есть ли такая функция или как реализовать подобный скрипт.

Answer 1

Вопрос оформлен доступно, побольше бы таких...

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;
Answer 2

Наверняка найдется более элегантный и правильный код, но вот как мне удалось решить данный вопрос самостоятельно.

#Исходный текст.
$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;

Я так думаю что с массивами можно по другому поступить, но не уверен. Если вы знаете как улучшить данный код, буду рад если вы укажете как. Всем мир.

READ ALSO
could not find driver

could not find driver

У меня нету extension=php_pdo_mysqldll в php

172
Парсинг цены coinmarketcap

Парсинг цены coinmarketcap

Хочу спарсить цену на ETH и BTC с кмк, но почему-то цена выводится 1 раз, только на биток или эфир, как оптимизировать скрипт?

141
PHP DOM XML добавить элемент в родителя

PHP DOM XML добавить элемент в родителя

я ищу способ добавления элемента в родительскийСтруктура xml документа такова:

180