2

次の行があるとします。

09:00 23/02/2012#3.5#2.2#91#3.7#7.4#170#S#1033.1#(+1 Hpa / 3H).#0#3H##4.5#Plus de 2500m #6####00#### Brume.#

15 番目以降の最初の数字または文字を探したい #
この場合、探している数字は 6 です。

この例では:

03:00 24/02/2012#8.9#5.5#79#3.7#5.55#190#S#1031.3#(-1.1 Hpa / 3H).#0#3H##10#300 et 600m#7####00#####

私が探している数字は7です。

ただし、これは常に数値であるとは限りません。たとえば、次の行のようになります。

00:00 29/02/2012#3.3#-0.2#78##3.7##N#1023.6#(+0.3 Hpa / 3H).#0#3H##22#Plus de 2500m######### Le ciel est clair.#

15 番目の # の後の文字も # です。

では、PHP の正規表現を使用してこの数字または文字を取得するにはどうすればよいでしょうか?

私は試した

$content = '09:00 23/02/2012#3.5#2.2#91#3.7#7.4#170#S#1033.1#(+1 Hpa / 3H).#0#3H##4.5#Plus de 2500m #6####00#### Brume.#';

$iparr = preg_split ("/#/", $content); 

echo $iparr[16];

しかし、3 番目の例では、何も得られません。(#が2連続なので)

4

3 に答える 3

5

使用できますexplode

$parts = explode('#', $string, 16);

$item = substr($parts[15], 0, 1);

PHP >= 5.4.0では、次のように記述できます。

$string = '09:00 23/02/2012#3.5#2.2#91#3.7#7.4#170#S#1033.1#(+1 Hpa / 3H).#0#3H##4.5#Plus de 2500m #6####00#### Brume.#';
$index  =  16;

var_dump(explode('#', $string)[$index - 1]);
于 2013-06-18T13:55:20.900 に答える
2

これは正規表現/を使用したバージョンですpreg_match

<?php
$str = "00:00 29/02/2012#3.3#-0.2#78##3.7##N#1023.6#(+0.3 Hpa / 3H).#0#3H##22#Plus de 2500m######### Le ciel est clair.#";
$match = array();
# match until 15 '#', grab the digit as well as a character
preg_match( "/(.*?#){15}([^\d]*(\d)|(.))/", $str, $match );
# the last element is the one containing best match, so just pop it
$char_after_15 = array_pop( $match );
print( $char_after_15 );
于 2013-06-18T14:22:01.167 に答える
1

2 つの基本的な問題があるようです: (1) 間に他の文字が存在する可能性がある場合に特定の数の特定の文字を一致させる方法、および (2) すべてを取得せずに後続のものを取得する方法。 Silkfireの答えはおそらくあなたの最良の選択肢ですが、正規表現でそれを行う方法は次のとおりです。

if (preg_match('/^(?:[^#]*#){15}(.)/', $subject, $match)) {
    $result = $match[1];
}

一度に複数の文字列に適用する場合は、次のようにします。

preg_match_all('/^(?:[^#]*#){15}(.)/', $subject, $matches, PREG_PATTERN_ORDER);
$result = $matches[1];

$resultこの場合、すべての一致からのグループ #1 の内容を含む 1 次元配列です。

編集:リフレクションでは、文字列は本質的に区切り文字では#なくCSV レコードのように見え,、16 番目のフィールドの数値が必要です。ただし、数値はオプションであるため、15 番目の区切り文字に続くものを取得し、それが数字でない場合は空のフィールドとして扱います。その場合は、次の正規表現を使用することをお勧めします。

'/^(?:[^#]*#){15}(\d*)/'

これは、数字がない場合に空の文字列をキャプチャします。さらに、問題が発生した場合に備えて、複数の数字を持つ数字と一致します。

于 2013-06-18T14:23:57.343 に答える