Получение разделителей известной строки - PullRequest
0 голосов
/ 14 апреля 2019

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

Пример: Строка: <li class="testing" id="testing">$$</li> Что я хотел бы получить: <li class="testing" id="testing"> и </li>

Пример² : строка erzg^esdbdf$$abcdefg Что я хотел бы получить: erzg^esdbdf и abcdefg

Вот мой текущий код, который нене работает:

$pattern = '/{{json: ' . $key . ', (.*)$$(.*)}}/';

Эти два разделителя могут быть тегами HTML или чем-либо еще.

Вот весь мой код:

    public function parse_config()
    {
        $data = Helpers::theme_config('default');
        $keys = [];

        if(!$data or !$data['extra'][0])
            return false;

        $pattern = '/{{json: (.*),/';
        preg_match($pattern, $this->htmlFile,$m);

        foreach ($m as $key => $value)
            if(($key - 1) % 2  == 0)
                $keys[] = $value;

        foreach ($keys as $key) {
            $pattern = '/{{json: ' . $key . ', (.*)$$(.*)}}/';
            $replace = '';

            foreach ($data['extra'][0][$key] as $value)
                $replace .= ' $1 ' . $value . ' $2 ';
            preg_replace($pattern, $replace, $this->htmlFile);
        }
    }

(Helpers::theme_configвозвращает таблицу проанализированного файла JSON)

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

Моя цель - заставить эти два разделителя задать новые значения.

Надеюсь, кто-то знает, что не так смой шаблон

спасибо.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Благодаря вашим ответам я реализовал способ делать то, что хотел. Я не знаю, оптимизирован ли он, но мы идем:

    public function parse_config()
    {
        $data = Helpers::theme_config('default');
        $keys = [];

        if(!$data or !$data['extra'][0])
            return false;

        $pattern = '/{{json: (.*),/';
        preg_match_all($pattern, $this->htmlFile, $m);

        foreach ($m[1] as $key => $value)
            $keys[] = $value;

        foreach ($keys as $key) {
            $pattern = '/{{json: ' . $key . ', (.*)}}/';
            preg_match($pattern, $this->htmlFile, $m);

            foreach ($m as $i => $value) {
                if (($i - 1) % 2 == 0) {
                    $delimiters = [];
                    $replace = '';

                    $delimiters[] = explode("{{var}}", $value);

                    foreach ($data['extra'][0][$key] as $v)
                        $replace .= implode($v, $delimiters[0]);

                    $this->htmlFile = preg_replace($pattern, $replace, $this->htmlFile);
                }
            }
        }
    }

Большое спасибо за ваши полезные ответы,
Любит Stackoverflow,
Габриэль.

0 голосов
/ 14 апреля 2019

Если я не неправильно понял ваши требования , тогда просто сделайте explode() и implode(), чтобы выполнить свою работу. Давайте попробуем вот так -

<?php
$string = '<li class="testing" id="testing">$$</li>';
$parts = explode("$$",$string);
print_r($parts);  // if wants result as 2 parts
echo implode(',', $parts); // if want result to concatenate it with comma as an string  
?>

DEMO: https://3v4l.org/uXmgZ

...