有个应用,使用已经给出的单词或词组进行组句,前提是只能使用给出的这些,每个可以多次使用,但是不能不用。
举个简单的例子,比如给的如下:aaa,bbb,ccc,ddd,eee
那么像
“aaa eee ddd ddd ccc bbb”ok
“aaa bbb ccc ddd” fail eee没有出现
“aaa eee ddd ddd ccc bbb other” fail other不是给出的
“aaabbb” fail aaabbb不是给出的
根据给的这个最简单例子,求个正则,
剩下的我就照着写就会了。

解决方案 »

  1.   

    难道还要用string提供的那些函数一个一个匹配啊,刚才写了一下发现要写很多代码,怕执行效率不高啊。
      

  2.   

    <?php 
    $str = 'aaa eee ddd ddd ccc bbb aaa eee ddd ';
    #$str = 'aaa eee ddd ddd ccc bbb aaa eee ddd';//ok
    #$str = 'aaa eee ddd ddd ccc aaa eee ddd';//failed
    #$str = 'aaa eee ddd ddd ccc bbbs aaa eee ddd';//failed
    #$str = 'aaa eee ddd ddd  ccc bbb aaa eee ddd';//failed
    #$str = 'aaa aaa aaa aaa aaa aaa aaa';//failed
    #$str = 'aaabbbccc aaa bbb ddd';//failed
    preg_match('/^(?:(?:(aaa)|(bbb)|(ccc)|(ddd)|(eee))(?: |\b)){5,}(?(1)|(?!))(?(2)|(?!))(?(3)|(?!))(?(4)|(?!))(?(5)|(?!))$/', $str, $matches);
    var_dump($matches);真想不通这个应用的用途所在……
      

  3.   

    不用正则,可以少死不少脑细胞include 'ttrie.php';
    class word extends TTrie {
      public $savematch = 0;  function __construct() {
        $this->set(' ');
      }
      function match($s) {
        $this->buffer = array();
        parent::match($s);
        return $this->buffer;
      }
    }$s = 'aaa bbb ccc ddd';
    //$s = 'aaa eee ddd ddd ccc bbb other';
    $p = new word();$d = array('aaa','bbb','ccc','ddd','eee');
    $r = $p->match($s);
    print_r( array_merge(array_diff($d, $r), array_diff($r, $d)));
      

  4.   


    终于找到老大的trie完整实例了。