我正在尝试在字符串中包含一个也不包含其他单词的可选匹配。
我有以下字符串
Stackoverflow 你好四个世界 foobar lorem php JavaScript globe
我想返回“Stackoverflow”,“four”(如果存在),“php”和“globe”,但只有当foobar不存在时才会返回。
我已将正则表达式的两个主要问题部分分为两个单独的模式(可选字符串四个和否定字符串 foobar )并且它们都单独工作,但在尝试时结合它们就失败了。
这个单独的部分将返回可选字符串 four (如果存在)。(不包括否定字符串 foobar )
$string = 'Stackoverflow hello four world foobar lorem php JavaScript (globe)';
$regex = "~(Stackoverflow) (?:.*?(four)|.*?) .*? (php) .*? (globe)~";
if(preg_match_all($regex,$string,$match))
print_r($match);
如果字符串 foobar 不存在,此单独部分将返回我们想要的组。(不包括可选字符串)
$string = 'Stackoverflow hello four world foobar lorem php JavaScript (globe)';
$regex = "~(Stackoverflow) (?:(?!foobar).)*? (php) .*? (globe)~";
if(preg_match_all($regex,$string,$match))
print_r($match);
我尝试了很多不同的方法,例如以下
$regex = "~(Stackoverflow) (?:.*?(four)|.*?) (?:(?!foobar).)*? (php) .*?(globe)~";
这将返回一个完整的结果,没有可选的四个,所以两个目标都失败了。
$regex = "~(Stackoverflow) (?:.*?(four).*?|.*?) (?:(?!foobar).)*? (php) .*?(globe)~";
此结果返回四,但仍然失败,因为它不关心foobar存在。
提前致谢。