php - 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 字符串中不包含右括号。
解决方案
这是一种方法。我们用于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>
推荐阅读
- amazon-web-services - 动态公共 IP 地址 ELB 的问题
- google-apps-script - onSelectionChange 只能间歇性地工作
- sql - 我想要做的是,消除所有修改日期小于 CI_NAME 列中每个条目的最大日期的行
- javascript - 模块构建失败(来自./node_modules/babel-loader/lib/index.js):错误:找不到模块'babel-core'
- azure - 使用 ARM 模板对 Azure 存储帐户容器设置合法保留
- command-line - 将凭据传递给 Jmeter 命令行
- c++ - 使用 std::thread 的多线程嵌套 for 循环
- python - 如何使用索引从 python 列表中提取与短语匹配的值以放入另一个数组?
- python - Python:如何在散点图上查找每个点的项目数并生成列表?
- linux - 如何使用 spi-loopback-test linux 内核模块?