正则表达式PHP在一定数量的#个字符后查找数字

时间:2013-06-18 13:49:10

标签: php regex

假设我有以下一行:

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次#)

3 个答案:

答案 0 :(得分: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]);

答案 1 :(得分: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 );

答案 2 :(得分:1)

似乎存在两个基本问题:(1)如果在两者之间可能存在其他字符时如何匹配给定字符的特定数量,以及(2)如何在不检索所有内容的情况下检索后面的内容。 silkfire's answer可能是你最好的选择,但是你可以用正则表达式来做到这一点:

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

如果你想一次将它应用于几个字符串,应该这样做:

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

$result是一个包含每场比赛中组#​​1内容的一维数组。

编辑:经过反思,看起来该字符串本质上是一个CSV记录,其中#而不是,作为分隔符,您想要的是第16个数字领域。但是这个数字是可选的,所以你抓住第十五个分隔符后面的任何内容,如果它不是数字,你就把它当作一个空字段。如果是这种情况,您可能想要使用此正则表达式:

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

如果没有数字,它会捕获一个空字符串,如果重要的话,它会匹配一个多个数字的数字。