I've a string describing a matrix of nxm elements like this one:
§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);
I need to build a regular expression (or something else) to search the string:
$search = "
*F*
FFF
*F*
";
$search = trim($search);
on the whole grid. On other hands I need to find a pattern of 5 distinct letter "F" (3 vertically and 3 horizzontally) getting back the rows/columns position of the pattern(s) found on the map.
Considering that the input matrix can be different (5x5 or 10x10 or 20x25 or ...), is there a way to solve my problem with php and regular expressions?
You can use $length=strstr($inputmap,"\\n")
to find the width of each line. You can then construct a regular expression that will find an F, followed by ($length-2)
other characters, followed by 3 Fs, followed by ($length-2)
other characters, followed by an F.
You can do something like this (without regular expressions) :
$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
$>
But I must admit that it could take a while for extra-big maps.
/!\\ add some code to verify that the line $vcount + 1/2
actually exists, and the char $hcount + 1
too.
You could use the following code:
$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;
}
}
}
}
What's going on ?
FFF
this is to increase performance. So instead of looping through the whole matrix and searching for F
, we directly search for FFF
F
Note that the coordinates are the center of the +
try with this pattern:
if the end of line is \\n
:
$pattern = '~F.{'. ($n-2) . '}FFF.{' . ($n-2) . 'F~s';
if the end of line is \\r\\n
then replace by $n-3
or better use quinxorin trick to know the line length until the \\n
@FrankieTheKneeMan & all... my initial approach was to build 'n' regular expression for 'n' chars of the input grid map. Something like...
$search_001 = "
.F......................................
FFF.....................................
.F......................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
";
$search_002 = "
..F.....................................
.FFF....................................
..F.....................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
";
(... omissis ...)
$search_100 = "
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
..........F.............................
.........FFF............................
..........F.............................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
";
(... omissis ...)
$search_999 = "
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
......................................F.
.....................................FFF
......................................F.
";
where "." obvioulsy means any character.
Is this a stupid idea?!?
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.