正则表达式PHP在一定数量的#字符后查找数字
假设我有下面一行:正则表达式PHP在一定数量的#字符后查找数字,php,regex,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
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];
但对于第三个例子,它没有给出任何结果。(因为有两个连续的#)您可以使用
分解
$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]);
下面是使用regex/
preg\u 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 );
似乎有两个基本问题:(1)当中间可能有其他字符时,如何匹配给定字符的特定数量;(2)如何检索后面的内容而不检索所有内容。这可能是您最好的选择,但下面是使用正则表达式的方法:
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*)/'
当没有数字时,它捕获一个空字符串,并且它将与一个数字以上的数字匹配,以防出现问题。您可以使用我知道它是preg_match!!但是怎么做呢?这个问题不需要使用正则表达式-使用explode
@maggie:你应该在你的问题中说明你尝试了什么。@ohaal:好的,我刚刚编辑了这个问题,以包含我所做的tried@Schleis换了,现在试试?我试过了,第一个例子,它给我的是a,而不是6。索引可能有问题吗?@maggie只需使用$parts[15][0]
而不用substr
(或$item=substr($parts[15],0,1)
如果您want@maggie如果您使用的是精确的字符串,它应该可以工作。16和15是索引。@silkfire,您需要数组中最后一个字符串的第一个字符,因此0,1
应该是substr