我对preg_replace不是很坚定 - 换句话说我真的不懂 - 所以我希望你能帮助我。
我在像这样的文本中有一个字符串:[demo category=1]
并希望替换为类别的内容(id = 1),例如“This is the Content of my first Category
”
这是我的起点模式 - 这就是我所拥有的:
'/[demo\s*.*?]/i';
希望你能帮忙吗?
答案 0 :(得分:1)
首先,您需要转义方括号,因为它们是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 :(得分:1)
根据上述答案,您有2种方法可以进行实际更换。假设您要替换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的类别名称的函数。你应该测试两个选项来评估哪个选项更快。
答案 2 :(得分:0)
模式将是这样的
/\[demo\s+category=(\d+)\]/i'
(你需要转义括号,因为它们很特殊)
答案 3 :(得分:0)
[
和]
字符具有特殊含义(它们表示字符类 - 字符的范围和集合)。您需要将[
转义为\[
(显然在PHP中,与其他正则表达式不同,您还需要转义]
)。另外我建议您使用字符类[^]]
=匹配任何不是]
的字符
/\[demo\s+[^]]*\]/i
应该更好。
编辑:如果要提取姓名和号码,则可以使用
/\[demo\s+(\w+)\s*=\s*(\d+)\]/i