字符串设置正则表达式查询像匹配任何订单的字符集

时间:2016-09-15 21:06:24

标签: php regex string

假设我们有3个字符串:

lorem,ipsum,set

和代码,输入字符串和预期结果是:

$array = array(
    "lorem" => "lorem",
    "loremipsum" => "loremipsum",
    "loremipsumset" => "FOUND!",
    "abc loremipsumset xyz" => "abc FOUND! xyz",
    "ipsumsetlorem" => "FOUND!",
    "ipsumloremset" => "FOUND!",
    "setipsumloremsetset" => "FOUND!",
    "loremloremipsumipsumsetset" => "FOUND!", // tough one...
    "lorem ipsum set" => "lorem ipsum set",
) ;
foreach ($array as $string => $expect) {
    $result preg_replace($REGEX,'FOUND!','abacdaef');
    echo ($result == $expect ? 'THANKS!!' : '...') ;
    echo '<br>' ;
}

在给定的输入中,三个字符串必须在一起,但是任何顺序......

"/((lorem|ipsum|set)+(lorem|ipsum|set)+(lorem|ipsum|set)+)+/"

这会以某种方式起作用,但它也与“loremloremlorem”匹配,

什么样的正则表达式可以处理?还是有简单的方法吗?

1 个答案:

答案 0 :(得分:1)

你可以这样做。
Php支持条件。如果你在每个单词周围设置一个警卫 匹配,它将强制引擎至少匹配所有这些。

https://regex101.com/r/fL1fR0/3

添加另一个字符串:

  • 将其放在一个单独的组中,其组的条件为| ((?(4)(?!))new string)
  • 将其添加到整体更改列表(?: lorem | ipsum | set | new string)
  • 将范围增加到等于单独字符串{4}
  • 的数量

这匹配数组中替换FOUND的所有位置。

\b(?:(?:((?(1)(?!))lorem)|((?(2)(?!))ipsum)|((?(3)(?!))set))(?:lorem|ipsum|set)*){3}\b

扩展

 \b 
 (?:
      (?:
           (                        # (1)
                (?(1)
                     (?!)
                )
                lorem
           )
        |  (                        # (2)
                (?(2)
                     (?!)
                )
                ipsum
           )
        |  (                        # (3)
                (?(3)
                     (?!)
                )
                set
           )
      )
      (?: lorem | ipsum | set )*
 ){3}
 \b