preg_replace在模式之间删除字符串的多个不同部分

时间:2012-09-17 21:30:55

标签: php regex preg-replace

这是我抓过的字符串的一小部分:

SEPVALAjazz(音乐)SEPVALC5.59SEPVALAlatin(音乐)SEPVALAcountry(音乐)SEPVALC6.70SEPVALArock(音乐)SEPVALC5.89SEPVALAdance(音乐)SEPVALAworld(音乐)SEPVALC6.70

我用正则表达式操纵了字符串以插入" SEPVALA"和" SEPVALC"值。我希望删除模式" SEPVALA" "(音乐)SEPVALA" 之间的字符串。在上面的例子中,这将删除" latin"和#34;跳舞"。

所需的结果是:

SEPVALAjazz(音乐)SEPVALC5.59SEPVALAcountry(音乐)SEPVALC6.70SEPVALArock(音乐)SEPVALC5.89SEPVALAworld(音乐)SEPVALC6.70

我目前正在实施的代码是:

$图案="(?+)/ SEPVALA \(音乐\)SEPVALA /&#34 ;;

$替换=" SEPVALA&#34 ;;

$ newstring = preg_replace($ pattern,$ replacement, $ originalstring );

然而,当正则表达式引擎选择第一个" SEPVALA" 时,会删除过多的字符串,并从此处删除所有内容,直到" (音乐)SEPVALA" (应该这样做!)我需要一种方法从"(音乐)SEPVALA向后扫描" 删除有问题的文本并停止在下一个" SEPVALA" 之后再转到"(音乐)SEPVALA" 的下一场比赛,依此类推。或任何其他方法来实现这一目标。非常感谢。

1 个答案:

答案 0 :(得分:1)

尝试使用空字符串替换以下模式:

SEPVALA((?!SEPVAL[AC]).)+(?<=\(music\))(?=SEPVALA)

示例:http://www.rubular.com/r/ZCfJQ4ey2O

说明:此方法的工作方式是匹配SEPVALA,然后一次匹配一个字符,直到SEPVALASEPVALC匹配为止,方法是使用带有重复的否定前瞻。此时我们已将SEPVALASEPVALASEPVALC之前匹配,因此我们只需要确保之前匹配的字符为(music),然后是下一个字符是SEPVALA

完整代码:

$pattern="/SEPVALA((?!SEPVAL[AC]).)+(?<=\\(music\\))(?=SEPVALA)/";
$replacement="";
$newstring=preg_replace($pattern, $replacement, $originalstring);