Замените указанные c части строки в PHP - PullRequest
2 голосов
/ 18 апреля 2020

У меня есть строка, которая выглядит следующим образом:

$string = '[some_block title="any text" aaa="something" desc="anytext" bbb="something else"]';

Мне нужно заменить текст между кавычками для заголовка = и деск =

Порядок заголовка и дес c может измениться, что означает, что des c может быть до заголовка, или могут быть и другие вещи, такие как aaa = или bbb = before / inbetween / after.

Я не могу использовать str_replace, потому что я делаю не знаю, какой текст появится между кавычками.

Я думаю, что одним из возможных решений является то, что я мог бы взорваться на заголовке =, а затем взорваться на двойных кавычках, а затем соединить его вместе с новым текстом, и повторите для desc =

Просто интересно, есть ли лучшее решение, о котором я не знаю, для того, чтобы сделать что-то подобное?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2020

Используйте функцию регулярного выражения php preg_replace, вы можете добавить шаблоны поиска и проход замены в виде двух массивов:

$string = preg_replace([
      '/ title="[^"]+"/',
      '/ desc="[^"]+"/',
   ], [
      sprintf(' title="%s"', 'replacement'),
      sprintf(' desc="%s"', 'replacement'),
   ], $string);

    // NOTE: Space was added in front of title= and desc= 
    // EXAMPLE: If you do not have a space, then it will replace the text in the quotes for title="text-will-get-replaced" as well as something similar like enable_title="text-will-get-replaced-as-well". Adding the space will only match title= but not enable_title=
0 голосов
/ 18 апреля 2020

Просто для интереса и сравнения я публикую свою исходную функцию в качестве примера "как не сделать это".

Я рекомендую ответ Павла Музиля, используя вместо этого preg_replace :

<?php

$string = '[some_block title="any text" aaa="something" desc="anytext" bbb="something else"]';

$new_string = replaceSpecial('title=', '"', 'my new text', $string);

echo $new_string; // will output: [some_block title="my new text" aaa="something" desc="anytext" bbb="something else"]

function replaceSpecial($needle, $text_wrapper, $new_text, $haystack) {
    $new_string = $haystack;
    $needle_arr = explode($needle, $haystack, 2);
    if (count($needle_arr) > 1) {
        $wrapper_arr = explode($text_wrapper, $needle_arr[1], 3);
        $needle_arr[1] = $wrapper_arr[0].$needle.'"'.$new_text.'"'.$wrapper_arr[2];
        $new_string = $needle_arr[0].$needle_arr[1];
    }
return $new_string;
}

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