PHP Regex-如何识别和替换大于/小于符号内的关键字?

时间:2019-01-20 23:12:28

标签: 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>

由于$ contents字符串中不包含右括号,因此我将不得不单独处理break。

1 个答案:

答案 0 :(得分:0)

这是一种方法。我们使用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>

Demo on 3v4l.org