PHP Regex - Как определить и заменить ключевые слова в пределах символов «больше / меньше»? - PullRequest
0 голосов
/ 21 января 2019

У меня есть строка текста ($ contents), содержащая различные теги в стиле XML, которые я хотел бы преобразовать в соответствующее значение в массиве пар ключ-значение ($ tagArray).

$contents = "<text>Text element</text><break><list><bullet>Bullet text</bullet></list>";

$tagArray = array(
"image" => "img",
"title" => "h1",
"text" => "p",
"break" => "br",
"list" => "ul",
"subtitle" => "h2",
"bullet" => "li",
);

$keys = array_keys($tagArray);

for($i=0; $i < count($keys); ++$i) {

    $re = '#<' . $keys[$i] . '>(.*?)</' . $keys[$i] . '>#';
    $replaced_tags = preg_replace($re, $tagArray[$keys[$i]] , $contents);

    echo $replaced_tags
}

Моя цель вывода для $ replace_tags:

<p>Text element</p><break><ul><li>Bullet text</li></ul>

Мне придется обрабатывать разрыв отдельно, так как он не содержит закрывающей скобки в строке содержимого $.

1 Ответ

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

Вот один из способов сделать это.Мы используем array_map для генерации массива шаблонов и замен и передаем его в preg_replace.Шаблоны содержат необязательный /, поэтому они могут соответствовать как закрывающим, так и открывающим тегам.Это реплицируется при замене с использованием $1 в строке замены.

$from = array_map(function ($v) { return "#<(/?)$v>#"; }, array_keys($tagArray));
$to = array_map(function ($v) { return "<\$1$v>"; }, $tagArray);
echo preg_replace($from, $to, $contents);

Вывод:

<p>Text element</p><br><ul><li>Bullet text</li></ul>

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

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