用动态替换文本替换方括号占位符

问题描述 投票:0回答:5

我在文本中有一个占位符,如下所示:

[demo category=1]
,我想用类别号 1 的内容替换占位符,例如
This is the Content of my first Category

这是我的起点模式 - 这就是我所拥有的:

'/[demo\s*.*?]/i';

php regex dynamic preg-replace placeholder
5个回答
2
投票

首先,您需要转义方括号,因为它们是 PCRE 中的特殊字符:

'/\[demo\s*.*?\]/i';

其次,听起来您想对末尾的数字执行某些操作,因此您需要使用括号来捕获它:

'/\[demo\s*.*?=(\d+)\]/i';

大括号将捕获

\d+
并将其存储在引用中。
\d+
将仅匹配一串数字。

最后,听起来您需要使用

preg_replace_callback
对匹配项执行特殊功能才能获得您想要的字符串:

function replaceMyStr($matches)
{
    $strNum = array("1"=>"first", "2"=>"second", "3"=>"third"); // ...etc
    return "This is the Content of my ".$strNum($matches[1])." Category.";
    // $matches[1] will contain the captured number
}
preg_replace_callback('/\[demo\s*.*?=(\d+)\]/i', "replaceMyStr", "[demo category=1]");

1
投票

除了上述答案之外,您还有两种方法来进行实际替换。假设您有 10 个要替换的类别名称,您可以执行类似的操作

for ($i = 1; $i <= $max_category; $i++) {
 $category_name = get_category_name($i);
 $s = preg_replace("/\[demo\s+category=(\d+)\]/i", $category_name, $s);
}

$s = preg_replace_callback("/\[demo\s+category=(\d+)\]/i", "get_category_name", $s);

在这两种情况下, get_category_name($id) 都是一个函数,它将获取 id 的类别名称。您应该测试这两个选项,以评估哪个选项对您的使用更快。


0
投票

图案会是这样的

/\[demo\s+category=(\d+)\]/i'

(你需要转义括号,因为它们很特殊)


0
投票

[
]
字符具有特殊含义(它们表示字符类 - 字符的范围和集合)。您需要将
[
转义为
\[
(显然,在 PHP 中,与其他正则表达式风格不同,您还需要转义
]
)。另外我建议您使用字符类
[^]]
= 匹配任何不是
]

的字符
/\[demo\s+[^]]*\]/i

应该会更好用。

编辑:如果你想提取姓名和号码,那么你可以使用

/\[demo\s+(\w+)\s*=\s*(\d+)\]/i

0
投票

解析占位符并捕获属性名称及其值。 在

preg_replace_callback()
的回调中,使用获取动态替换数据所需的任何机制。 如果尝试获取动态数据没有结果,只需将原始占位符替换为自身(实际上不进行任何更改)。

我一般不建议使用可变变量,但不清楚替换数据来自哪里,或者是否需要容纳多个属性名称。 另外,通常我更喜欢在回调中使用箭头语法,但变量变量在箭头函数语法中不起作用。

代码:(演示

$text = <<<TEXT
Here is some sample text [demo category=1] and
here is another placeholder [demo category=2]
[demo category=99] doesn't even exist.
TEXT;

$category = [
    1 => 'This is the Content of my first Category',
    2 => '2nd category text',
    3 => 'Cat 3 text',
];

echo preg_replace_callback(
    '/\[demo (\w+)=(\d+)]/',
    function($m) use ($category) {
        return ${$m[1]}[$m[2]] ?? $m[0];
    },
    $text
);

输出:

Here is some sample text This is the Content of my first Category and
here is another placeholder 2nd category text
[demo category=99] doesn't even exist.
© www.soinside.com 2019 - 2024. All rights reserved.