2012-07-02 185 views
1

下面的代码需要在$input,如:"a banana is a fruit"sscanf忽略空格?

$t = sscanf($input,"a %s is a %s",$child,$parent); 
echo $t.",".$child.",".$parent; 

它输出:2,banana,fruit,这是完美的!

但是,如果$input = "a cow is an animal"我们得到输出:2,cow,n。这并不理想。

理想情况下,对于$input = "a cow is an animal"它将返回1,cow,,我将使用单独的格式化字符串:"a %s is an %s"该输入将返回2,cow,animal

所以:为什么第二个a"a %s is a %s"之后的空间不会发生这个问题呢?有没有办法明确声明一个空间必须发生在a之后才能找到正确的匹配?

希望这是有道理的。任何帮助感谢!

编辑:这是实际的代码:

$teachArray = array("a %s is a %s","an %s is a %s","a %s is an %s","an %s is an %s"); 
$i=0; 
$t = -1; 
while((t <= 2) && (i < count($teachArray))) { 
    $t = sscanf($input,$teachArray[i],$child,$parent); 
    $i++; 
} 

所以它不断循环,直到它找到一个匹配的句子结构,或者它运行的一句模板(存储在$ teachArray)。

回答

4

相反scanf函数,你应该使用regular expression

$input = "a cow is an animal"; 
preg_match("/^an? (.+?) is an? (.+?)$/", $input, $matches); 
echo (count($matches)-1) . ',' . $matches[1] . ',' . $matches[2]; 
+0

哇。目睹了它的力量,我现在要学习一些正则表达式。谢谢! – JoeRocc

0

我觉得你还是可以使用的sscanf的是,尽管正则表达式更加灵活。

$t = sscanf($input,"%s %s is %s %s",$a1, $child, $a2, $parent); 
echo $t.",".$child.",".$parent;