我有一个像这个结构的文本(实际上这是html)
" B1-B2"之后" abc"几次(或一次,或从不)
abc
- hello -
b1 hello b2
- hello -
b1 hello b2
我想将其改为
abc
- hello -
z1 hello z2
- hello -
z1 hello z2
我可以用这个
改变第一次出现$text = preg_replace('/(abc.+?)b1(.+?)b2/s',"$1z1$2z2",$text);
文字变为
abc
- hello -
z1 hello z2
- hello -
b1 hello b2
问题是如何改变" b"?
的其他出现答案 0 :(得分:1)
使用以下正则表达式,然后将匹配替换为z
(?:a|(?<!^)\G).*?\Kb
并且不要忘记启用DOTALL修饰符s
。
示例:强>
$string = <<<EOT
a
- hello -
b hello b
- hello -
b hello b
EOT;
echo preg_replace('~(?:a|(?<!^)\G).*?\Kb~s', 'z', $string);
<强>输出:强>
a
- hello -
z hello z
- hello -
z hello z
答案 1 :(得分:1)
这是另一种解决方案:
(a|(?<!^)\G)(.*?)<h1>(.*?)<\/h1>
替换为$1$2<h2>$3<h2>
。
参见演示
$re = "/(a|(?<!^)\\G)(.*?)<h1>(.*?)<\\/h1>/s";
$str = "a\n - hello -\n <h1> hello </h1>\n - hello -\n <h1> hello </h1>";
$subst = "$1$2<h2>$3<h2>";
$result = preg_replace($re, $subst, $str);
输出:
a
- hello -
<h2> hello <h2>
- hello -
<h2> hello <h2>
编辑:我的方法可以访问子匹配,而Avinash Raj只关注实际的deilimiter替换。