php preg_replace匹配

时间:2011-03-01 22:12:43

标签: php regex

如何将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]”的上述注释行正常工作。我缺少一些语法吗?

2 个答案:

答案 0 :(得分:3)

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

/i修饰符只会对其中没有套接字母的图案造成伤害。

答案 1 :(得分:0)

您不能以这种方式使用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;