1

次のコードは次の$inputようになります。"a banana is a fruit"

$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"止めないのは2番目以降のスペースですか?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

2 に答える 2

4

scanf の代わりに、正規表現を使用する必要があります。

$input = "a cow is an animal";
preg_match("/^an? (.+?) is an? (.+?)$/", $input, $matches);
echo (count($matches)-1) . ',' . $matches[1] . ',' . $matches[2];
于 2012-07-02T12:39:47.087 に答える
0

正規表現の方が柔軟ですが、sscanfを引き続き使用できると思います。

$t = sscanf($input,"%s %s is %s %s",$a1, $child, $a2, $parent);
echo $t.",".$child.",".$parent;
于 2013-12-12T07:37:30.650 に答える