假设我有以下一行:
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次#)
答案 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*)/'
如果没有数字,它会捕获一个空字符串,如果重要的话,它会匹配一个多个数字的数字。