1

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

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

我用正则表达式操作了字符串以插入“SEPVALA”和“SEPVALC”值。我希望删除文本中出现的模式“SEPVALA”“(music)SEPVALA”之间的字符串。在上面的示例中,这将删除“latin”和“dance”。

期望的结果是:

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

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

$pattern="/SEPVALA(.+?)\(音乐\)SEPVALA/";

$replacement="SEPVALA";

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

但是,这会删除太多的字符串,因为正则表达式引擎会拾取第一个“SEPVALA”并从这一点向前删除所有内容,直到“(音乐)SEPVALA” (应该这样做!)我需要一种从向后扫描”的方法(music)SEPVALA"删除有问题的文本并在下一个"SEPVALA"处停止,然后继续前进到"(music)SEPVALA"的下一个匹配项,依此类推。或任何其他方法来实现这一点。非常感谢。

4

1 回答 1

1

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

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

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

说明:这是通过匹配SEPVALA,然后一次匹配一个字符,直到匹配SEPVALASEPVALC可以匹配,通过使用带有重复的负前瞻来工作。至此,我们已经在orSEPVALA之前匹配了 from ,所以我们只需要确保之前匹配的字符是,接下来的字符是。SEPVALASEPVALC(music)SEPVALA

完整代码:

$pattern="/SEPVALA((?!SEPVAL[AC]).)+(?<=\\(music\\))(?=SEPVALA)/";
$replacement="";
$newstring=preg_replace($pattern, $replacement, $originalstring);
于 2012-09-17T21:39:09.983 回答