将插入符号添加到正则表达式替换中

时间:2011-03-25 13:15:12

标签: php regex

我正在尝试将一个Carat添加到php中的日期

preg_replace('(/[0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{4}\/[0-9]{2}\/[0-9]{2}/)', "/\^${1}/", $FileStream);

2000-01-01成为^2000-01-01; 不工作

2 个答案:

答案 0 :(得分:1)

试试这个:

preg_replace('/([0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{4}\/[0-9]{2}\/[0-9]{2})/',
             "^$1", $FileStream); 

您当前的正则表达式如下:

'(/regex/)'

因此()被视为正则表达式分隔符,//被视为文字。

但你想要的是:

'/(regex)/'

以便/充当分隔符,(..)捕获字符串匹配的一部分,以便它可以替换为$1而不是${1}。使用过。

答案 1 :(得分:1)

preg_replace(
  '/([0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{4}\/[0-9]{2}\/[0-9]{2})/' ,
  "^$1" ,
  $FileStream
);

作为参考,您的解决方案包含以下错误:

  1. 在字符串中使用变量,并使用大括号来包含它时,将$保留在括号内 - $varName将起作用,因此{$varName}${varName}/(.*)/ 1}}会失败。
  2. 使用正则表达式,您可以在匹配的模式的开头和结尾处使用匹配的字符 - 正则表达式分隔符。该字符意味着在您用于捕获匹配文本段的任何括号之外。 (/.*/)会起作用,但/会尝试将左括号视为分隔符,因此会失败。 (另外,它会尝试在模式的开头和结尾找到{{1}}个字符。)