Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式PHP在一定数量的#字符后查找数字_Php_Regex - Fatal编程技术网

正则表达式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