在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);
但无法弄清楚如何替换这些匹配中的内容并返回整个文本,包括正确的替换。
有什么想法吗?
答案 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',