5

次の文字列を検討してください。

$strings = array(
    "8.-10. stage",
    "8. stage"
);

各文字列の最初の整数を抽出したいので、返されます

8
8

preg_replace で数値を除外しようとしましたが、すべての整数が返され、最初の数値のみが必要です。

foreach($strings as $string)
{
    echo preg_replace("/[^0-9]/", '',$string);
}

助言がありますか?

4

8 に答える 8

22

正規表現を使用した便利な (記録破りのパフォーマンスではありませんが) ソリューションは次のようになります。

$string = "3rd time's a charm";

$filteredNumbers = array_filter(preg_split("/\D+/", $string));
$firstOccurence = reset($filteredNumbers);
echo $firstOccurence; // 3

入力に少なくとも 1 つの数値があると仮定すると、これは最初の数値を出力します。

数字以外の文字は、数字を区切ると見なされるという事実を除けば、完全に無視されます。つまり、最初の数字は入力内の任意の場所に発生する可能性があります (必ずしも先頭にあるとは限りません)。

文字列の先頭にある数字のみを考慮したい場合は、正規表現は必要ありません。

echo substr($string, 0, strspn($string, "0123456789"));
于 2013-03-01T10:19:58.753 に答える
9
preg_match('/\d+/',$id,$matches);
$id=$matches[0];
于 2015-06-09T06:30:32.217 に答える
8

整数が常に文字列の先頭にある場合:

(int) $string;

そうでない場合、strpbrkは最初の負でない数を抽出するのに役立ちます:

(int) strpbrk($string, "0123456789");

代替案

これらのワンライナーは、 preg_splitpreg_replace、およびpreg_matchに基づいています。

preg_split("/\D+/", "$string ")[1];
(int) preg_replace("/^\D+/", "", $string);
preg_match('/\d+/', "$string 0", $m)[0];

これらのうちの 2 つは文字列に余分な文字を追加するため、空の文字列や数字のない文字列は問題を引き起こしません。

これらの代替ソリューションは、でない整数のみを抽出するためのものであることに注意してください。

于 2016-02-08T22:26:41.637 に答える
2

これを試して:

$strings = array(
    "8.-10. stage",
    "8. stage"
);

$res   = array();
foreach($strings as $key=>$string){
  preg_match('/^(?P<number>\d)/',$string,$match);
  $res[$key] = $match['number'];
}

echo "<pre>";
print_r($res);
于 2013-03-01T10:19:45.277 に答える
1
foreach($strings as $string){
    echo preg_replace("/([0-9]+)\./", "\\1",$string);
}
于 2013-03-01T10:20:06.157 に答える
1
foreach($strings as $string){
 if(preg_match("/^(\d+?)/",$string,$res)) {
   echo $res[1].PHP_EOL;
 }
}
于 2013-03-01T10:20:24.023 に答える