PHP Regex:几次搜索

时间:2015-04-24 08:32:17

标签: php html regex

我有一个像这个结构的文本(实际上这是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"?

的其他出现

2 个答案:

答案 0 :(得分:1)

使用以下正则表达式,然后将匹配替换为z

(?:a|(?<!^)\G).*?\Kb

并且不要忘记启用DOTALL修饰符s

DEMO

示例:

$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替换。