0

PHP では、特定の識別子の間にあるファイル内の特定のコンテンツを置き換えるのに助けが必要です。

例えば ​​:

abcde
-BEGIN-
   bcdef
-END-
cdefg
-BEGIN-
   doo wah diddy
-END-
defgh

「d」文字を「z」に置き換える必要があるとしますが、toセクション間のみです。結果は次のようになります。-BEGIN--END-

abcde
-BEGIN-
   bczef
-END-
cdefg
-BEGIN-
   zoo wah zizzy
-END-
defgh

preg_match_all-BEGIN- から -END- セクションを次のように識別しようとしました。

$text = file_get_contents($file);
preg_match_all('#-BEGIN-.*?-END-#s', $text, $matches);

しかし、これらの一致内の何かを置き換えて、正しい置換を含むテキスト全体を返す方法がわかりません。

何か案は?

4

2 に答える 2

0

Preg_replace()でうまくいくはずです。

于 2012-10-20T00:59:09.047 に答える
0

これは-BEGIN--END-内のブロックを検索し、出現するすべてのd文字をzに置き換えます(したがってpreg_replace()、3 行目の関数)。

$str = preg_replace_callback(
    '~(?<=(?<=\n|^)-BEGIN-\n).*?(?=\n-END-)~s',
    create_function('$m','return preg_replace("~d~s","z",$m[0]);'),
    $str
);

編集 1:両方の正規表現ルールで mフラグをsに変更しました。


EDIT 2:ここに正規表現のより良いバージョンがあることを確認したい場合(すべての可能な改行文字が考慮されます-Windows、Unixなど)。

    '~(?<=
        (?<=\n|\r|\r\n|^)   -BEGIN- \n |
        (?<=\n|\r|\r\n|^)   -BEGIN- \r |
        (?<=\n|\r|\r\n|^)   -BEGIN- \r\n
    )
    .*?
    (?=
        \n      -END-   (?=\n|\r|\r\n|$) |
        \r      -END-   (?=\n|\r|\r\n|$) |
        \r\n    -END-   (?=\n|\r|\r\n|$)
    )~xs',
于 2012-10-20T01:37:18.313 に答える