PHP заменить некоторые строки между тегами или символами - PullRequest
0 голосов
/ 28 января 2019

Мне нужно заменить текст в строке.Я думаю, что пример может объяснить лучше:

[myFile.json]

{ "Dear":"newString1", "an example string":"newString2" }

[example.php]

$myString = "@Dear@ name, this is @an example string@.";

function gimmeNewVal($myVal){
    $obj = json_decode(file_get_contents('myFile.json'));
    return $obj->$myVal;
}

echo gimmeNewVal("Dear"); // This print "newString1"

Итак, мне нужно найтилюбые строки между символом '@' и для каждой найденной строки мне нужно заменить, используя функцию gimmeNewVal ().

Я уже пробовал использовать функции preg_ *, но я не очень хорошо умею с регулярным выражением ...

Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы можете использовать preg_match_all для сопоставления всех строк типа @somestring@, используя регулярное выражение @([^@]+)@, а затем выполнить итерацию по циклу for, чтобы выполнить замену каждой такой найденной строки в исходной строке, чтобы заменить ее фактическим значением изваша функция gimmeNewVal, которая возвращает значение из вашего заданного json.

Вот код PHP для того же самого,

$myString = "@Dear@ name, this is @an example string@.";

function gimmeNewVal($myVal){ // I've replaced your function from this to make it practically runnable so you can revert this function as posted in your post
    $obj = json_decode('{ "Dear":"newString1", "an example string":"newString2" }');
    return $obj->$myVal;
}

preg_match_all('/@([^@]+)@/', $myString, $matches);
for ($i = 0; $i < count($matches[1]); $i++) {
    echo $matches[1][$i].' --> '.gimmeNewVal($matches[1][$i])."\n";
    $myString = preg_replace('/'.$matches[0][$i].'/',gimmeNewVal($matches[1][$i]), $myString);

}
echo "\nTransformed myString: ".$myString;

Печатает преобразованную строку,

Dear --> newString1
an example string --> newString2

Transformed myString: newString1 name, this is newString2.

Дайте мне знать, если это то, что вы хотели.

0 голосов
/ 30 января 2019

Вы также можете использовать T-Regx tool :

pattern('@([^@])@')->replace($input)->all()->by()->map([
    '@Dear@' => "newString1", 
    '@an example string@' => 'newString2'
]);

или

pattern('@([^@])@')->replace($input)->all()->group(1)->by()->map([
    'Dear' => "newString1", 
    'an example string' => 'newString2'
]);

Вы также можете использовать методы by()->map(), by()->mapIfExists() или by()->mapDefault().Все, что вам нужно:)

0 голосов
/ 28 января 2019

Вы можете использовать функцию preg_replace_callback

$myString = "@Dear@ name, this is @an example string@.";

$obj = json_decode(file_get_contents('myFile.json'));

echo preg_replace_callback('/@([^@]+)@/', 
        function ($x) use($obj) { return isset($obj->{$x[1]}) ? $obj->{$x[1]} : ''; }, 
        $myString);

демо

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