结合可选匹配,同时否定

时间:2014-03-17 16:22:57

标签: php regex

我正在尝试在字符串中包含一个也不包含其他单词的可选匹配。

我有以下字符串

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存在。

提前致谢。

0 个答案:

没有答案