Использование preg_replace с различными заменами переменных - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь использовать preg_replace для поиска строки, но динамически c * меняю только часть строки, а не всю строку.

Например, я могу чтобы найти строки 'od', ': od', 'od:', '#od' и 'od' с моим кодом ниже. Я хочу заменить только часть «od» словом «одометр» и оставить нетронутыми двоеточие, хэштег и пробелы. Однако способ написания моего текущего preg_replace заменит двоеточия и хэштег в дополнение к самим буквам. Какие-нибудь творческие решения для замены только персонажей, но с сохранением окружающих символов?

Спасибо!

if(isset($_POST["text"]))
{
    $original = $_POST["text"];
    $abbreviation= array();
    $abbreviation[0] = 'od';
    $abbreviation[1] = 'rn';        
    $abbreviation[2] = 'ph';
    $abbreviation[3] = 'real';  
    $translated= array();
    $translated[0] ='odometer';
    $translated[1] ='run';
    $translated[2] ='pinhole';
    $translated[3] ='fake';

function add_regex_finders($str){
    return "/[\s:\#]" . $str . "[\s:]/i";
}

$original_parsed = array_map('add_regex_finders',$original);
preg_replace($original_parsed,$translated,$original);

}

1 Ответ

0 голосов
/ 10 февраля 2020

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

function add_regex_finders($str){
    return "/([\s:\#])" . $str . "([\s:])/i";
}

$abbrevs_parsed = array_map('add_regex_finders', $abbreviation);
$translt_parsed = array_map(function ($v) { return '$1' . $v . '$2'; }, $translated);
echo preg_replace($abbrevs_parsed, $translt_parsed, $original);

Демонстрация на 3v4l.org

Обратите внимание, что в вашем коде была опечатка, передавая $original на вызов add_regex_finders, когда должно быть $abbreviation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...