Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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_Pattern Matching - Fatal编程技术网

php垂直正则表达式搜索

php垂直正则表达式搜索,php,regex,pattern-matching,Php,Regex,Pattern Matching,我有一个字符串,它描述了一个由n x m个元素组成的矩阵,如下所示: §inputmap = " ~~~~~~~~~~~~~~~~~~~~B~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~BBB........BBB~~~~~~~~~~~~~ ~~~~~~~~~~BB...............FBB~~~~~~~~~~ ~~~~~~~~BB....................BB~~~~~~~~ ~~~~~~BB.....F..................BB~~~

我有一个字符串,它描述了一个由n x m个元素组成的矩阵,如下所示:

§inputmap = "
~~~~~~~~~~~~~~~~~~~~B~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~BBB........BBB~~~~~~~~~~~~~
~~~~~~~~~~BB...............FBB~~~~~~~~~~
~~~~~~~~BB....................BB~~~~~~~~
~~~~~~BB.....F..................BB~~~~~~
~~~~~BB.....................F.....B~~~~~
~~~~B..............................B~~~~
~~~B........F.......................B~~~
~~BB.........F......................BB~~
~~B................F.................BB~
~BF....F....F........................FB~
~B.....................................B
B.....................................FB
B........F......F......................B
B...........................F..........B
B......................................B
B......................................B
B.......F.......................F......B
B......FFF.............................B
B.......F.............................FB
~B..................F.................FB
~BF...........................F.......B~
~~B...F...........F..........FFFFF.F.BB~
~~BB..................F..F....F.....BB~~
~~~B.......................FF.FF....B~~~
~~~~B..............................B~~~~
~~~~~BB...........................B~~~~~
~~~~~~BB........................BB~~~~~~
~~~~~~~~BB..........F..........B~~~~~~~~
~~~~~~~~~~BB................BB~~~~~~~~~~
~~~~~~~~~~~~~BBB.......F.BBB~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~BBBBBB~~~~~~~~~~~~~~~~~
";
$inputmap = trim($inputmap);
我需要构建一个正则表达式(或其他东西)来搜索字符串:

$search = "
*F*
FFF
*F*
";
$search = trim($search);
在整个网格上。另一方面,我需要找到一个由5个不同字母“F”(3个垂直字母和3个水平字母)组成的图案,以恢复在地图上找到的图案的行/列位置


考虑到输入矩阵可能不同(5x5或10x10或20x25或…),是否有办法解决我在php和正则表达式方面的问题?

您可以使用
$length=strstr($inputmap,“\n”)
查找每行的宽度。然后,您可以构造一个正则表达式,该表达式将找到一个F,后跟
($length-2)
其他字符,后跟3个Fs,后跟
($length-2)
其他字符,后跟一个F。

您可以这样做(没有正则表达式):

$map=explode(“\n”,$inputmap);
对于($vcount=0;$vcountphp test.php
php test.php
发现模式,从:(v)18 x(h)8开始
发现模式,从:(v)22 x(h)30开始
$>
但我必须承认,制作超大地图可能需要一段时间

/!\添加一些代码以验证行
$vcount+1/2
是否实际存在,以及字符
$hcount+1
是否也存在。

尝试使用以下模式:

如果行尾为
\n

$pattern = '~F.{'. ($n-2) . '}FFF.{' . ($n-2) . 'F~s';
如果行尾为
\r\n
,则替换为
$n-3


或者最好使用quinxorin技巧来知道行长度,直到
\n

@FrankieTheKneeMan&all。。。我最初的方法是为输入网格映射的“n”个字符构建“n”正则表达式。类似于

$search_001 = "
.F......................................
FFF.....................................
.F......................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
";


$search_002 = "
..F.....................................
.FFF....................................
..F.....................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
";
(…奥米西斯…)

(…奥米西斯…)

其中“.”显然是指任何字符


这是个愚蠢的主意吗

您可以使用以下代码:

$lines = array_filter(preg_split("#\r\n?|\n#", $string)); // Creating array of lines
$matrix = array_map('str_split', $lines); // Creating a matrix

foreach($lines as $line_number => $line_content){ // Looping through the lines
    $pos = strpos($line_content, 'FFF');
    if(!$pos === false){// If FFF found
        while(true){
            if(isset($matrix[$line_number-1][$pos+1],$matrix[$line_number+1][$pos+1]) && $matrix[$line_number-1][$pos+1] == 'F' && $matrix[$line_number+1][$pos+1] == 'F'){ //Checking ...
                echo 'Found at: X:'.$pos.' & Y:'.$line_number.'<br>'; // Ouput
            }
            $pos = strpos($line_content, 'FFF', $pos+1); // Search further
            if(!is_int($pos)){
                break;
            }
        }
    }
}
$lines=array_filter(preg#u split(#\r\n?|\n#“,$string));//创建线数组
$matrix=数组映射($str_split',$lines);//创建矩阵
foreach($line\u number=>$line\u content形式的行){//在行之间循环
$pos=strpos($line_content,'FFF');
if(!$pos==false){//if找到FFF
while(true){
如果(isset($matrix[$line\u number-1][$pos+1],$matrix[$line\u number+1][$pos+1])&&$matrix[$line\u number-1][$pos+1]=='F'&$matrix[$line\u number+1][$pos+1]='F'){//正在检查。。。
echo'位于:X:'.$pos.&Y:'.$line_编号。
;//输出 } $pos=strpos($line_content,'FFF',$pos+1);//进一步搜索 如果(!is_int($pos)){ 打破 } } } }
发生了什么事?

  • 我们创建一个线数组
  • 我们创建一个矩阵
  • 我们在各行中循环搜索
    FFF
    ,这是为了提高性能。因此,我们不是在整个矩阵中循环搜索
    F
    ,而是直接搜索
    FFF
  • 检查矩阵中是否存在该值(以防止未定义的索引错误),然后检查它是否等于
    F
  • 输出
  • 在同一行上进一步搜索

  • 注意,坐标是+

    的中心,我认为正则表达式不是这项工作的合适工具。您应该将字符串转换为二维数组并在数组中搜索。这可以在“线性”时间内完成(实际上,如果它是边长为n的平方矩阵,则很容易在(n)^2时间内完成)。您的问题太复杂,无法使用正则表达式。编写一个小脚本,在输入中查找搜索的第一行,并验证下面的其他行是否匹配使用数组索引。首先,你能告诉我们你尝试了什么吗;我们在这里是为了帮助你,而不是为你做一切。一般的解决方案是,对于每一组,检查网格列(0-2)和行(0-2)的一个子部分,然后移动到一个子部分上;继续检查,直到你排到最后。然后在列(0-2)和行(1-3)处向下移动一列,继续向右读取,直到到达数组的右下角。您可以通过数组索引或创建一个巨大的字符串并以这种方式对其进行解析来解决此问题。FrankieTheKneeMan,谢谢您的建议。。。我会按照你的建议去做一些事情。法奎特,这是不可能的方法?至少就你所见?德文,你完全正确!我不是要求任何人给我一个白手起家的解决方案,而是将我的方法与有我同样问题的人提供的更好的方法进行比较。顺便说一句,我完全同意你的看法!出于好奇,
    “FFF\nFFF\nFFF”
    匹配吗?@MarZab。。。我欣赏你的坦率!(我不是在讽刺!)《黑客帝国》可能帮不了你。你可以只使用
    $lines
    stripos
    substr
    @FrankieTheKneeMan True,但如果我使用
    $lines[$I][$y]
    ,那就很难理解了。
    $lines[$I][$y]
    对应什么?你根本不需要它。@FrankieTheKneeMan一个简单的表单
    $foo='abc';echo$foo[1]
    将输出
    b
    。只是说,因为数组映射在计算上非常昂贵,并且不会增加很多可读性(如果有的话)。这绝对无助于计算。这是一个非常聪明的解决方案。但是我认为您正在寻找的正则表达式是(对于NxM矩阵)
    /F.{N-1}FFF.{N-1}F/
    
    $search_100 = "
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ..........F.............................
    .........FFF............................
    ..........F.............................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ";
    
    $search_999 = "
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ........................................
    ......................................F.
    .....................................FFF
    ......................................F.
    ";
    
    $lines = array_filter(preg_split("#\r\n?|\n#", $string)); // Creating array of lines
    $matrix = array_map('str_split', $lines); // Creating a matrix
    
    foreach($lines as $line_number => $line_content){ // Looping through the lines
        $pos = strpos($line_content, 'FFF');
        if(!$pos === false){// If FFF found
            while(true){
                if(isset($matrix[$line_number-1][$pos+1],$matrix[$line_number+1][$pos+1]) && $matrix[$line_number-1][$pos+1] == 'F' && $matrix[$line_number+1][$pos+1] == 'F'){ //Checking ...
                    echo 'Found at: X:'.$pos.' & Y:'.$line_number.'<br>'; // Ouput
                }
                $pos = strpos($line_content, 'FFF', $pos+1); // Search further
                if(!is_int($pos)){
                    break;
                }
            }
        }
    }