0
$str = "234 567 some text following";

文字列の 3 番目の文字から最後の数字までの部分文字列を取得するにはどうすればよいですか?

$positionOfNewLeadingCharacter = 3;

上記の例では4 567、3 番目の文字から文字列の末尾までではなく、部分文字列が返されるようにします。 7サンプル文字列の最後の数字です。

私の実際のアプリケーションの文字列は、テキストと数値が混在している可能性があります。既知の位置から最後に発生した数値の位置までの部分文字列を抽出する必要があります。

4

6 に答える 6

1

あなたはしたい:

  1. 新しい最初の文字になる文字のオフセットを指定して、文字列の先頭から文字を削除します
  2. 文字列の末尾から 0 個以上の非デジタル文字を削除します。

これは確かに 1 回のpreg_match()呼び出しで実行できますが、パターンの可読性はあまり高くありません。

を使用substr()すると、不要な先頭文字を削除できます。ただし、開始オフセットが 0 未満にならないように注意してください。そうしないと、意図しない結果が得られます。スニペットにマルチバイト サポートを組み込んでいません。

3 番目の文字から開始するには、2 番目のオフセットから開始するために 1 を減算する必要があります。

文字列の末尾から0 個以上 ( *) の非デジタル文字 ( \D) をトリミングするには、文字列の末尾アンカー ( $) を使用します。

コード: (デモ)

$str = "234 567 some text following";

$start = 3;

var_export(
    preg_replace(
        '/\D*$/',
        '',
        substr($str, max($start, 1) - 1)
    )
);

出力:

'4 567'

醜いpreg_match()方法: (デモ)

var_export(
    preg_match(
        '/.{' . max($start - 1, 0) . '}\K.*\d/',
        $str,
        $match
    )
    ? $match[0]
    : 'no match'
);
于 2021-10-16T07:41:50.600 に答える
0

substr 関数を使用する必要があります

substr($str, 2);

編集 :

正規表現で

$pattern = '/^[0-9]+/';
preg_match($pattern, substr($str, 2), $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);

EDIT2:テスト済みで動作します

$pattern = '/^([0-9][ ]*)+/';
preg_match($pattern, substr($str, 2), $matches);
print_r($matches);

EDIT3 : 最後の編集が表示されませんでした。新しい編集を作成します^^

EDIT4:

$str = "234 567 some text 123 22 following 12 something";
$pattern = '/^([ ]*([0-9][ ]*)*([a-zA-Z][ ]*)*[0-9]*)*[0-9]/';
preg_match($pattern, substr($str, 2), $matches);
echo $matches[0];

ください4 567 some text 123 22 following 12

それはあなたが期待しているものですか?

編集5:

またまた新作^^

'/^([0-9 :._\-]*[a-zA-Z]*[:._\-]*)*[0-9]/'
于 2012-05-14T10:24:49.657 に答える
0

これを試して:

substr($str,2,strlen($str));

編集(新しい回答):

このコードは機能しています:

$str = preg_replace( "/\D/", "", $str);
echo substr($str,2);
于 2012-05-14T10:25:39.583 に答える
0
<?php
  $subStr = substr($str, 2);
?>

デフォルトでは、長さ (3 番目のパラメーター) を省略すると、デフォルトで文字列の末尾になります。文字は 0 から始まるため、3 番目の文字は位置 2 になることに注意してください。

于 2012-05-14T10:25:45.163 に答える
0

これを行うには、正規表現で否定先読みを使用します。

<?php
    $lastNumber = getLastNumber("234 567 some text following");
    var_dump($lastNumber);

    function getLastNumber($string) {
        preg_match("/[0-9](?!.*[0-9])/", $string, $match);
        if (!empty($match[0])) return $match[0];
        return false;
    }
?>

編集:申し訳ありませんが、読み間違えました。最後のスタンドアロン番号が必要だと思いました。

二重編集:これはあなたが望むことをするようです

<?php
    $string = substr("234 567 some text 123 22 following", 2);
    preg_match("/[0-9 ]+/", $string, $matches);
    if (!empty($matches)) {
        $number = intval(str_replace(" ", "", $matches[0]));
        var_dump($number);
    }
?>

「4567」を返すので。もちろん、スペースを残したい場合は、$matches[0]代わりに を使用して$numberください。

于 2012-05-14T10:36:09.010 に答える