我在文本中有一个占位符,如下所示:
[demo category=1]
,我想用类别号 1 的内容替换占位符,例如This is the Content of my first Category
这是我的起点模式 - 这就是我所拥有的:
'/[demo\s*.*?]/i';
首先,您需要转义方括号,因为它们是 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]");
除了上述答案之外,您还有两种方法来进行实际替换。假设您有 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 的类别名称。您应该测试这两个选项,以评估哪个选项对您的使用更快。
图案会是这样的
/\[demo\s+category=(\d+)\]/i'
(你需要转义括号,因为它们很特殊)
[
和 ]
字符具有特殊含义(它们表示字符类 - 字符的范围和集合)。您需要将 [
转义为 \[
(显然,在 PHP 中,与其他正则表达式风格不同,您还需要转义 ]
)。另外我建议您使用字符类 [^]]
= 匹配任何不是 ]
的字符
/\[demo\s+[^]]*\]/i
应该会更好用。
编辑:如果你想提取姓名和号码,那么你可以使用
/\[demo\s+(\w+)\s*=\s*(\d+)\]/i
解析占位符并捕获属性名称及其值。 在
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.