这是我抓过的字符串的一小部分:
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" 的下一场比赛,依此类推。或任何其他方法来实现这一目标。非常感谢。
答案 0 :(得分:1)
尝试使用空字符串替换以下模式:
SEPVALA((?!SEPVAL[AC]).)+(?<=\(music\))(?=SEPVALA)
示例:http://www.rubular.com/r/ZCfJQ4ey2O
说明:此方法的工作方式是匹配SEPVALA
,然后一次匹配一个字符,直到SEPVALA
或SEPVALC
匹配为止,方法是使用带有重复的否定前瞻。此时我们已将SEPVALA
与SEPVALA
或SEPVALC
之前匹配,因此我们只需要确保之前匹配的字符为(music)
,然后是下一个字符是SEPVALA
。
完整代码:
$pattern="/SEPVALA((?!SEPVAL[AC]).)+(?<=\\(music\\))(?=SEPVALA)/";
$replacement="";
$newstring=preg_replace($pattern, $replacement, $originalstring);