2013-11-14 81 views

回答

1

如果这是唯一的要求,那么也许:

if(($pos = strpos($haystack, $first_word)) !== false && strpos($haystack, $second_word, $pos)) { 
    // $second_word found after $first_word 
} 
+0

但是,这还通过是否存在之后的第二'“第一第二首”重复第一个字'我想你可以建仓的阵列,每个字,然后对它们进行排序然后逐个比较元素。或者,您可以使用正则表达式。 – sln

+0

这不是一个要求。需要更多的规则来扩展这一点。 “第二个第一秒”怎么样? – AbraCadaver

+0

是的,为了覆盖边缘条件,它很难'^(?:(?!second)。)* first(?:(?!second | first)。)* second(?:(?! first)。)* $' – sln

0

你可以试试这个:

if (preg_match('~^(?>[^bg]+|\B[bg]|b(?!adword\b)|g(?!oodword))*+\bgoodword\b~', $str, $match)) 
    echo 'ok'; 
else 
    echo 'fail'; 

你必须采取的"badword"的第一个字母( “B”),并允许它仅在没有后面跟着"adword"

^是字符串开头的锚点

\b是字边界和\B是相反的。

(?!...)意味着 “不跟”

与存储到变量一些文本的例子:$text_before$text_after

$flb = preg_quote($text_before[0]); 
$fla = preg_quote($text_after[0]); 
$subb = substr($text_before, 1); 
$suba = substr($text_after, 1); 

if(preg_match('~^(?>[^' . $flb . $fla . ']+|\B[' . $flb . $fla ']|' 
      . $flb . '(?!\Q' . $subb . '\E\b)|' 
      . $fla . '(?!\Q' . $suba . '\E\b))*+\b' 
      . $text_after . '\b~', $str, $match)) { 
    echo 'ok'; 
} else { 
    echo 'fail'; 
} 
+0

谢谢!再一次,stackoverflow被证明是最有用的资源。我确实使用下面的代码来工作,但不相信它是健壮的。 preg_match(“/ \ b(”。$ textBefore。“|”。$ textAfter。“)\ b /”,$ this-> response)您的解决方案看起来更健壮,所以会试用。 – jaffamoney

+0

@ user2686371:我已经更新了我的答案,因为我已经忘记了我的模式中的某些内容,并且已经添加了此技术的代码示例。 –

0

也许这

# ^(?:(?!word_after).)*word_before(?:(?!word_after|word_before).)*word_after(?:(?!word_before).)*$ 

^ 
(?: 
     (?! word_after) 
     . 
)* 

word_before 

(?: 
     (?! word_after | word_before) 
     . 
)* 

word_after 

(?: 
     (?! word_before) 
     . 
)* 
$ 
0

起初我还以为要建议你使用strpos(),但如果你需要匹配确切的单词,它可能无法工作。我调查的东西是这样的:

function AbeforeBinC($a, $b, $string) 
{ 
    $aStr = explode(' ', strtolower($string)); 
    foreach($aStr AS $k => $s) 
    { 
    if($a == $s){ $a = $k; } 
    if($b == $s){ $b = $k; } 
    } 
    var_dump($a < $b); 
} 

$str = "We are here to take care of you"; 

AbeforeBinC('are', 'take', $str); 
相关问题