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" (2012 年 4 月 10 日 \r\nmonday など) に一致するテキストの変換された部分もすべて保存する必要があることです。配列。私はこのようなものを持っているように:

 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 に答える