佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 851|回复: 7

PHP 函数 preg_replace 问题

[复制链接]
发表于 22-2-2006 12:08 AM | 显示全部楼层 |阅读模式

  1. $text = '[quote=1,1140366376]asdf[/quote]';
  2. $pattern = array(
  3. "/\s*\[quote=(.+?)[x|\,](\d{1,10})\][\n\r]*(.+?)[\n\r]*\[\/quote\]\s*/"
  4. );
  5. $replacement = array(
  6. "\\2"
  7. );
  8. $text = preg_replace($pattern,$replacement,$text);
  9. echo $text;
复制代码

输出结果为:
1140366376

可我将以上第 6 行的字体:"\\2" 改为:
gmdate("Y-m-d","\\2")
后,输出结果变成:
1970-01-01

为什么输出结果不是:
2006-02-19

呢?
有谁可以告诉我吗?谢谢!

[ 本帖最后由 hui_yang 于 22-2-2006 12:09 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 22-2-2006 12:37 PM | 显示全部楼层
第六行用 date("Y-m-d") 不可以咩?
回复

使用道具 举报

发表于 22-2-2006 01:21 PM | 显示全部楼层
原帖由 hui_yang 于 22-2-2006 12:08 AM 发表
[code]
$text = '[quote=1,1140366376]asdf
';
$pattern = array(
"/\s*\[quote=(.+?)[x|\,](\d{1,10})\][\n\r]*(.+?)[\n\r]*\[\/quote\]\s*/"
);
$replacement = array(
"\\2" ... [/quote]

gmdate把"\\2"当作是string了,backreference在gmdate里面是无效的。
回复

使用道具 举报

 楼主| 发表于 22-2-2006 04:29 PM | 显示全部楼层

那要用什么方法达到我的需求呢?谢谢!

为什么其他function如custom function就可以辨认backreference,而gmdate就不能呢?
例如:
我将以上(第 1 楼)第 6 行的字体:"\\2" 改为:bar("\\3")

  1. function bar($string) {
  2. $output = '<table border=1><tr><td>';
  3. $output .= $string;
  4. $output .= '</td></tr></table>';
  5. return $output;
  6. }
复制代码

输出就没有问题:
asdf



那要用什么方法达到我的需求呢?谢谢!

原帖由 旋转便便 于 22-2-2006 12:37 PM 发表
第六行用 date("Y-m-d") 不可以咩?

date("Y-m-d","\\2") 和 gmdate("Y-m-d","\\2")  的输出结果都是一样

[ 本帖最后由 hui_yang 于 22-2-2006 04:40 PM 编辑 ]
回复

使用道具 举报

发表于 22-2-2006 04:40 PM | 显示全部楼层
原帖由 hui_yang 于 22-2-2006 04:29 PM 发表
为什么其他function如custom function就可以辨认backreference,而gmdate就不能呢?
例如:
我将以上(第 1 楼)第 6 行的字体:"\\2" 改为:bar("\\3")[/c ...

注意看一下你的custom function的return value,我将它简化

bar($string){
return "this is returned value: ".$string;
}

等于

$replacement = array("this is returned value: \\2");

这样当然没问题。
gmdate的parameter需要timestamp,timestamp经过gmdate function之后才pass进preg_replace。
所以,如果要转换成time string,我建议可以这样

$text = gmdate("Y-m-d",preg_replace($pattern,$replacement,$text));
回复

使用道具 举报

 楼主| 发表于 22-2-2006 04:54 PM | 显示全部楼层
谢谢 kfchai1982 再次出手相助
$text = gmdate("Y-m-d",preg_replace($pattern,$replacement,$text));
以上方法没有问题如果红色字体的return value只是timestamp,不过以上的只显示日期的code是我简化后的,我原本的code是:

  1. $replacement = array(
  2. "\\1 于 ".gmdate("\\2")." 发表:".bar("\\3")
  3. );
复制代码


所以请问还有其他方法吗?

[ 本帖最后由 hui_yang 于 22-2-2006 04:56 PM 编辑 ]
回复

使用道具 举报

Follow Us
发表于 22-2-2006 05:23 PM | 显示全部楼层
先把preg_replace的return value拿出来再做formating

$replacement = array(
"\\1"."||"."\\2"."||"."\\3"
);

$result = explode("||",preg_replace($pattern,$replacement,$text));
$text = $result[0]." 于 ".gmdate($result[1])." 发表:".bar($result[2]);
回复

使用道具 举报

 楼主| 发表于 22-2-2006 05:27 PM | 显示全部楼层

感谢kfchai1982大大

虽然方法很麻烦下,可是仍然是没有方法中的方法,看来也只有这样了

非常感谢kfchai1982大大不厌其烦地多次出手相助!!!谢谢!!
回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 21-9-2024 10:58 PM , Processed in 0.121404 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表