Ste*_*lli 6 php regex pattern-matching
我有一个字符串描述像这样的nxm元素矩阵:
§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);
Run Code Online (Sandbox Code Playgroud)
我需要构建一个正则表达式(或其他东西)来搜索字符串:
$search = "
*F*
FFF
*F*
";
$search = trim($search);
Run Code Online (Sandbox Code Playgroud)
在整个网格上.另一方面,我需要找到一个5个不同字母"F"的图案(垂直3个,水平3个),回到地图上找到的图案的行/列位置.
考虑到输入矩阵可以是不同的(5x5或10x10或20x25或......),有没有办法解决我的PHP和正则表达式的问题?
你可以这样做(没有正则表达式):
$map = explode("\n", $inputmap);
for ($vcount = 0; $vcount < sizeof($map); ++$vcount) { // Loop through the map vertically
for ($hcount = 0; $hcount < strlen($map[$vcount]); ++$hcount) { // Loop through each character of each line
if ($map[$vcount][$hcount] == "F") {
if ($map[$vcount + 1][$hcount - 1] == "F" && $map[$vcount + 1][$hcount] == "F" &&
$map[$vcount + 1][$hcount + 1] == "F" && $map[$vcount + 2][$hcount] == "F")
echo "Pattern found, starting at : (v)$vcount x (h)$hcount";
}
}
}
$> php test.php
php test.php
Pattern found, starting at : (v)18 x (h)8
Pattern found, starting at : (v)22 x (h)30
$>
Run Code Online (Sandbox Code Playgroud)
但我必须承认,对于超大地图可能需要一段时间。
/!\ 添加一些代码来验证该行$vcount + 1/2以及该字符是否确实存在$hcount + 1。
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |