【问题标题】:php preg_replace matchesphp preg_replace 匹配
【发布时间】:2011-03-01 22:12:43
【问题描述】:

如何将 preg_replace 中的匹配项作为可用变量访问?这是我的示例代码:

<?php
$body = <<<EOT
Thank you for registering at <!-- site_name -->

Your username is: <!-- user_name -->

<!-- signature -->
EOT;

$value['site_name'] = "www.thiswebsite.com";
$value['user_name'] = "user_123";

$value['signature'] = <<<EOT
live long and prosper
EOT;

//echo preg_replace("/<!-- (#?\w+) -->/i", "[$1]", $body);
echo preg_replace("/<!-- (#?\w+) -->/i", $value[$1], $body);
?>

我不断收到以下错误消息:

解析错误:语法错误,意外 '$',期望 T_STRING 或 T_VARIABLE 第 18 行

当匹配变量包含在引号中时,上面带有“[$i]”的注释行可以正常工作。我缺少一些语法吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    像这样:echo preg_replace("/&lt;!-- (#?\w+) --&gt;/", '$1', $body);

    /i 修饰符只能对其中没有大小写字母的模式造成伤害,顺便说一句。

    【讨论】:

    • 我需要使用 $1 来索引 $value[$1]。
    • @gurun8:那么你需要使用preg_replace_callback(),这样你就可以在每次匹配时执行代码。
    • preg_replace_callback() 非常完美。谢谢!
    【解决方案2】:

    您不能以这种方式使用preg_replace。它没有定义一个名为$1 的变量,您可以在没有替换之外的情况下进行交互;字符串'$1' 仅在内部用于表示模式的第一个子表达式。

    您必须使用preg_match 查找与(#?\w+) 匹配的字符串,然后使用preg_replace 将匹配的字符串替换为对应的$value

    $value['site_name'] = "www.thiswebsite.com";
    $value['user_name'] = "user_123";
    $value['signature'] = "something else";
    
    $matches = array();
    $pattern = "/<!-- (#?\w+) -->/i";
    
    if (preg_match($pattern, $body, $matches)) {
      if (array_key_exists($matches[1], $value)) {
        $body = preg_replace($pattern, '<!-- ' . $value[$matches[1]] . ' -->', $body);
      }
    }
    
    echo $body;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2013-11-05
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多