首页 > 解决方案 > PHP Regex - 如何识别和替换大于/小于符号中的关键字?

问题描述

我有一个包含各种 XML 样式标签的文本字符串 ($contents),我想将其转换为键值对数组 ($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
}

我对 $replaced_tags 的目标输出是:

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

我将不得不单独处理 break 因为它在 $contents 字符串中不包含右括号。

标签: phpregex

解决方案


这是一种方法。我们用于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 上的演示


推荐阅读