Explosions on a chessboard
JavaScript (ES6) 305 310 321

As a function with 2 real parameters (and a lot more with default values, used as a quick and dirty way to define locals)

Test running the snippet below (being EcmaScript 6, Firefox only)



F=(g,m,b=[...g.replace(/\d/g,c=&gt;'0'.repeat(c))],P=p=&gt;p=='p'|p=='P',n=parseInt(m,32),
  s=n&gt;&gt;5&amp;31,u=n&gt;&gt;15,x=b[y=u+62-(n&gt;&gt;10&amp;31)*9])=&gt;(
  b[b[y]=0,z=s+62-(n&amp;31)*9]&lt;1&amp;!(s!=u&amp;P(x))?b[z]=x:
  [-1,1,8,9,10,-8,-9,-10].map(i=&gt;b[i+=z]&gt;'/'&amp;&amp;!P(b[i])?b[i]=0:0,b[b[z]&lt;1?z&gt;y?z-9:z+9:z]=0),
  b.join('').replace(/0+/g,x=&gt;x.length)
)

//TEST
out=x=&gt;O.innerHTML+=x+'\n'

test=[
 ['rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR', 'g1f3'
  ,'rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R']
,['3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK', 'f2g3'
  ,'3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK']  
,['rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R', 'f3b7'
  ,'3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R']
,['rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R', 'e5d6'
  ,'rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R']
,['5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q', 'c6h1'
  ,'5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2']
]

test.forEach(t=&gt;( 
  r=F(t[0],t[1]), 
  out('Test '+(r==t[2]?'Ok':'Fail!')+'  '+t[0]+' move '+t[1]
     +'\nResult   '+r+'\nExpected '+t[2]+'\n')))
&lt;pre id=O&gt;&lt;/pre&gt;




Ungolfed

B=(b,m)=&gt;{
  P=p=&gt;p=='p'|p=='P'
  m=parseInt(m,32) 
  r=m&amp;31 // arrival row
  s=(m/32&amp;31)-10 // arrival column
  z=s+(8-r)*9 // arrival position
  t=m/32/32&amp;31 // start row
  u=(m/32/32/32&amp;31)-10 // start column
  y=u+(8-t)*9 // start position
  b=[...b.replace(/\d/g,c=&gt;'0'.repeat(c))] // board to array, empty squares as 0
  x=b[y] // moving piece
  b[y]=0 
  C=s!=u&amp;P(x) // pawn capture
  if (b[z]&lt;1 &amp;&amp; !C)
  {  // no capture
    b[z]=x
  }
  else
  {
    // capture and boom!
    if (b[z]&lt;1) // arrival empty: en passant
      b[z&gt;y?z-9:z+9]=0;
    else
      b[z]=0;
    // zero to nearest 8 squares
    [-1,1,8,9,10,-8,-9,-10].forEach(i=&gt;b[i+=z]&gt;'/'&amp;&amp;!P(b[i])?b[i]=0:0)
  }
  return b.join('').replace(/0+/g,x=&gt;x.length)
}