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];

但对于第三个例子,它什么也没给出。(因为连续 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

似乎有两个基本问题:(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 的内容。

编辑:经过反思,看起来该字符串本质上是一个 CSV 记录,#而不是,作为分隔符,并且您想要第十六个字段中的数字。但是数字是可选的,因此您可以抓取第十五个分隔符之后的任何内容,如果它不是数字,则将其视为空字段。如果是这种情况,您可能需要使用此正则表达式:

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

当没有数字时,这会捕获一个空字符串,并且它会匹配一个多于一位的数字,以防万一。

于 2013-06-18T14:23:57.343 回答