preg_replace模式

时间:2010-03-22 10:15:50

标签: php regex preg-replace

我对preg_replace不是很坚定 - 换句话说我真的不懂 - 所以我希望你能帮助我。

我在像这样的文本中有一个字符串:[demo category=1]并希望替换为类别的内容(id = 1),例如“This is the Content of my first Category

这是我的起点模式 - 这就是我所拥有的: '/[demo\s*.*?]/i';

希望你能帮忙吗?

4 个答案:

答案 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