【问题标题】:preg_replace Patternpreg_replace 模式
【发布时间】:2013-09-30 00:14:28
【问题描述】:

我对 preg_replace 不是很坚定——换句话说,我不太明白——所以我希望你能帮助我。

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

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

希望你能帮忙?

【问题讨论】:

  • 您的意思是要将字符串“[demo category=1]”替换为“Content of Category (id=1)”吗?
  • 我有例如$content[0]='This is Nr.1' 和 $content[1]='This is Nr. 的数组。 2' - 现在我想用 $content[$categoryid] 替换 [demo category=1]

标签: php regex preg-replace


【解决方案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]");

【讨论】:

    【解决方案2】:

    除上述答案外,您还有 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 的类别名称的函数。您应该测试这两个选项,以评估哪个更适合您的使用。

    【讨论】:

      【解决方案3】:

      模式会是这样的

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

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

      【讨论】:

        【解决方案4】:

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

        /\[demo\s+[^]]*\]/i
        

        应该会更好。

        编辑:如果要提取姓名和号码,则可以使用

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

        【讨论】:

        • 嗯。确实 RegexBuddy 建议了这一点。对于绝对不需要的其他风格(如 Python),它也是如此。我认为 RegexBuddy 在这里过于谨慎。我没有用 PHP 尝试过 - 当] 没有转义时确定它不起作用?
        • 它确实有效,但出于可读性原因仍应转义。
        • 嗯。我发现尽可能避免不必要的反斜杠有助于提高可读性。有趣的是,Jan Goyvaerts 曾在博客中讨论过这个问题:regexguru.com/2008/12/…
        • ...在这里:regexguru.com/2008/04/escape-characters-only-when-necessary - 在这种情况下,他主张逃避关闭]。口味问题,到底...
        猜你喜欢
        • 2015-06-02
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多