randomizex
@randomizex
http://resume.web-ivan.ru

Как правильно разбить одну сроку опираясь на другую?

Задача:
есть 2 стороки
a) Lorem {val1} dolor sit {val2}, consectetur adipisicing {val3}.
b) Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Как видно строка (b) это таже строка (a) в которой были подставлены значения в блоки {}.

Как мне опираясь на обе строки получить массив след вида:
$res = [
"{val1}" => "ipsum",
"{val2}" => "amet",
"{val3}" => "elit"
];


В строке (a) всегда подменяются ТОЛЬКО блоки в фигурных скобках.
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$mask = "Lorem {val1} dolor sit {val2}, consectetur adipisicing {val3}.";
$str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit.";

preg_match_all("/({.*?})/", $mask, $mask_matches);

$re = '/^' . preg_replace("/\\\{.*?\\\}/", '(.*?)', preg_quote($mask, '/')) . '$/';
preg_match($re, $str, $str_matches);
array_shift($str_matches);

$result = array_combine($mask_matches[1], $str_matches);
print_r($result);
Array
(
    [{val1}] => ipsum
    [{val2}] => amet
    [{val3}] => elit
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@user49981
$str1 = 'Lorem {val1} dolor sit {val2}, consectetur adipisicing {val3}';
        $str2 = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit';

        $words1 = explode(' ', $str1);
        $words2 = explode(' ', $str2);

        $items = count($words1);
        $result = [];

        for($i = 0; $i< $items; $i++) {
            if(preg_match('/{\w*}/', $words1[$i])) {
                $result["$words1[$i]"] = $words2[$i];
            }
        }

        print_r($result);
Ответ написан
@dimoff66
Кратко о себе: Я есть
Вырезал фигурные скобки в итоге, думаю не нужны, если нужны, то $patterns[] = $m[0];
И это решение не зависит от того, есть ли в строке пробелы или нет.

$s1 = 'Lorem {val1} dolor sit {val2}, consectetur adipisicing {val3}.';
$s2 = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.';

$patterns = [];
$pattern2 = preg_replace_callback('|\{([a-z0-9]+)\}|', function($m) use (&$patterns) {
    $patterns[] = $m[1];
    return '(.*)';
}, $s1);

preg_match('|' . $pattern2 . '|', $s2, $matches);
$res = array_combine($patterns, array_slice($matches, 1));

var_dump($res);
Ответ написан
Комментировать
@SteelJames
Тут полное раздолье для творчества. Любой программист только обрадуется такой задачке.
Как вариант такое решение: Разбивать строку на подстроки между "}" и "{", предварительно превратив строку в "}" + str + "{", чтобы было проще обрабатывать граничные варианты.
Затем пройтись по получившемуся набору, вырезая из второй строки порвый найденный вариант. Оставшиеся подстроки и будут нужными значениями
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы