PHP:如何替换文本,但仅限于某些标识符之间?

时间:2012-10-20 00:56:48

标签: php regex preg-match-all

在PHP中,我需要帮助替换某些标识符之间的文件中的某些内容。

例如:

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

我们假设我需要将'd'字符替换为'z',但 -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);

但无法弄清楚如何替换这些匹配中的内容并返回整个文本,包括正确的替换。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

Preg_replace()应该可以做到这一点。

答案 1 :(得分:0)

搜索 -BEGIN - -END - 中的块,然后用 z <替换所有 d 字符的出现/ strong>(因此第3行中的preg_replace()函数)。

$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

<小时/> 编辑2:如果你想确保这是一个更好的Regex版本(所有可能的换行符都考虑在内 - 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',