php挑战:解析伪正则表达式

php挑战:解析伪正则表达式,php,Php,我有一个挑战,我还没有弄明白,但它似乎可以是有趣的,相对容易的人谁认为在算法 如果我的搜索词中有一个“?”字符,这意味着它不应该关心前面的字符是否在那里(如在正则表达式中)。但是我想让我的程序打印出所有可能的结果 举几个例子:“tab?le”应该打印“table”和“tale”。结果的数量始终是问号数量的2倍。另一个例子是:“carn?ati?on”应打印: 卡拉顿 焦糖 卡纳顿 康乃馨 我正在寻找一个函数,它将接受带问号的单词并输出一个包含所有结果的数组…我认为这样的循环应该可以工作: $

我有一个挑战,我还没有弄明白,但它似乎可以是有趣的,相对容易的人谁认为在算法

如果我的搜索词中有一个“?”字符,这意味着它不应该关心前面的字符是否在那里(如在正则表达式中)。但是我想让我的程序打印出所有可能的结果

举几个例子:“tab?le”应该打印“table”和“tale”。结果的数量始终是问号数量的2倍。另一个例子是:“carn?ati?on”应打印:

  • 卡拉顿
  • 焦糖
  • 卡纳顿
  • 康乃馨

我正在寻找一个函数,它将接受带问号的单词并输出一个包含所有结果的数组…

我认为这样的循环应该可以工作:

$to_process = array("carn?ati?on");
$results = array();
while($item = array_shift($to_process)) {
    $pos = strpos($item,"?");
    if( $pos === false) {
        $results[] = $item;
    }
    elseif( $pos === 0) {
        throw new Exception("A term (".$item.") cannot begin with ?");
    }
    else {
        $to_process[] = substr($item,0,$pos).substr($item,$pos+1);
        $to_process[] = substr($item,0,$pos-1).substr($item,$pos+1);
    }
}
var_dump($results);
以“carn?ati?on”为例:

您可以将单词/字符串拆分为“”上的数组,那么数组中每个字符串的最后一个字符将是可选字符:

[0] => carn
[1] => ati
[2] => on
然后,您可以为第一个数组中的每个元素创建两种不同的可能性(即有和没有最后一个字符),并将这些排列映射到另一个数组。注意,对于上述转换,应忽略最后一个元素,因为它不适用。我会这样做:

[0] => [carn, car]
[1] => [ati, at]
[2] => [on]
然后我将迭代子数组中的每个元素,以计算所有不同的组合


如果您在应用此过程中遇到困难,请发表评论。

您尝试过什么?也许我们可以从那里开始:)想法?是的,看起来并不难。构建一个表达式列表,其中包含一个标志,指示表达式是必需的还是可选的。你试过什么?耶!你阅读并理解了这个问题!(不像某些…)有+1!出色的实施!这正是我想要的。我在最初的文章中没有提到我用非英语Unicode字符来做这件事,它似乎打破了你写的东西(可能是因为STRPOS和SUBR),但是我想用这个作为基础,我可以让它工作。非常感谢!啊,是的,这段代码不是多字节安全的,因为它只会“切换”
前面的字节,可能会在后面留下断字符。但是,如果您使用
mb_substr
mb_strop
,那么它应该工作得很好。