1

我有一个包含许多日期的大文本,格式如下:

 10 april 2012, monday

我需要将它们全部转换成这种格式:

 \r\nmonday, 10 april 2012

所以,我写了一个正则表达式,它工作得很好。

 $matches1= preg_replace(
 '#(\d{,2} [a-z]+) \d{4}, (sunday|monday|tuesday|wednesday|thursday|friday|saturday)#u', 
 "\r\n$2$3$4$5$6$7$8, $1", 
 $txt);

问题是我还需要将与替换模式匹配的文本的所有转换部分 - "\r\n$2$3$4$5$6$7$8, $1" (如 \r\nmonday, 10 april 2012) - 保存到大批。所以我有这样的事情:

 Array('\r\nmonday, 10 april 2012', '\r\ntuesday, 11 april 2012', '\r\nfriday, 14 april 2012' etc.)

那可能吗?

替换模式 ("\r\n$2$3$4$5$6$7$8, $1") 来自 html 表单,可能会有所不同。

更新

我试图写一个回调函数,但我无法得到我需要的结果。所以我想出了以下几点:

 $text = ...;//some text
 $search = ...;//search pattern
 $replacement = ...;//replacement pattern

 preg_match_all('#' . $search. '#u', $text, $matches, PREG_SET_ORDER);

 foreach ($matches as $match) 
 {
     $replacements[] = preg_replace('#' . $search. '#u', $replacement, $match[0]);
 }

 $newtext = preg_replace('#' . $search. '#u', $replacement, $text);

所以 $newtext 包含转换后的文本, $replacenemts 包含所有替换。

4

3 回答 3

4

改为使用preg_replace_callback(或在以下代码示例中另外使用示例)并跟踪所有替换:

$search =  '#(\d{,2} [a-z]+) \d{4}, (sunday|monday|tuesday|wednesday|thursday|friday|saturday)#u';
$replace = "\r\n$2$3$4$5$6$7$8, $1";
$captured = array();

preg_replace_callback($search, function($matches) use (&$captured)  {
    $captured[] = $matches;    
}, $txt);

$matches1= preg_replace($search, $replace, $txt);
于 2012-05-28T13:17:01.493 回答
1

使用 preg_replace_callback 和一个自定义函数,它将匹配项存储到一个数组中并返回替换字符串。

于 2012-05-28T13:09:53.850 回答
0

您也可以在中间使用逗号和空格分割字符串,然后在使用1$txtArr = explode(', ', $txt, 1);将它们推入数组的同时将它们连接在一起。不要忘记定义您将添加日期的数组(例如)。array_push($matches, $txtArr[1].', '.$txtArr[0]);$matches = array();

如果它们位于一大串文本中,您可以使用 RegEx 函数定位它们,并利用它将“清理”的匹配项放入数组中。

于 2012-05-28T13:26:47.323 回答