在字符串中搜索两个单词以验证一个单词在另一个单词之前

时间:2013-11-14 18:03:17

标签: php regex preg-match

经过大量的谷歌搜索,在这里提问。我希望能够搜索字符串以验证一个字在另一个字之前(在php中),但不一定彼此相邻。我很确定这很简单,但很难找到答案!

4 个答案:

答案 0 :(得分:1)

如果这是唯一的要求,那么可能:

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

答案 1 :(得分: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';
}

答案 2 :(得分: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 )
      . 
 )*
 $ 

答案 3 :(得分: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);