<?php
$offset = 10 ; // конфиг длины строки, которой дополняется место ошибки
// не могу придумать внятное имя
// впрочем для каждого вида ошибки он должен быть свой
$possibleErrors = [
[
'regExp' => "/.{0,{$offset} }\b\w+[,;!?:]\S+\b.{0,{$offset} }/ui" ,
'descr' => 'Нет пробела после запятой, точки с запятой, восклицательного знака, ' .
'вопросительного знака, двоеточия.' ,
] ,
[
'regExp' => "/.{0,{$offset} }\b\w*[жш]ы\w*\b.{0,{$offset} }/ui" ,
'descr' => 'Жи/ши написано через "ы".' ,
] ,
[
'regExp' => "/.{0,{$offset} }\bкоординально\b.{0,{$offset} }/ui" ,
'descr' => 'Ошибка в слове "кардинально."' ,
] ,
[
'regExp' => "/.{0,{$offset} }\b(сдесь|зделан|зделаю)\b.{0,{$offset} }/ui" ,
'descr' => 'Неправильная приставка c-/з-.' ,
] ,
[
'regExp' => "/.{0,{$offset} }[^,]\s\b(но|а)\b.{0,{$offset} }/ui" ,
'descr' => 'Пропущена запятая перед предлогом "а" или "но".' ,
] ,
] ;
$text = 'Тут координально пропущен пробел,после запятой но перед точкой' .
'Слово пушыстый сдесь написано с ошыбкой.' ;
foreach ( $possibleErrors as $error ) {
$matches = [ ] ;
foreach ( $matches [ 0 ] as $match ) {
echo $error [ 'descr' ] . " Место с ошибкой: \n >> {$match} \n \n " ;
}
}
PD9waHAgCiRvZmZzZXQgPSAxMDsgLy8g0LrQvtC90YTQuNCzINC00LvQuNC90Ysg0YHRgtGA0L7QutC4LCDQutC+0YLQvtGA0L7QuSDQtNC+0L/QvtC70L3Rj9C10YLRgdGPINC80LXRgdGC0L4g0L7RiNC40LHQutC4Ci8vINC90LUg0LzQvtCz0YMg0L/RgNC40LTRg9C80LDRgtGMINCy0L3Rj9GC0L3QvtC1INC40LzRjwovLyDQstC/0YDQvtGH0LXQvCDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0LLQuNC00LAg0L7RiNC40LHQutC4INC+0L0g0LTQvtC70LbQtdC9INCx0YvRgtGMINGB0LLQvtC5CgokcG9zc2libGVFcnJvcnMgPSBbCglbCgkJJ3JlZ0V4cCcgPT4gIi8uezAseyRvZmZzZXR9fVxiXHcrWyw7IT86XVxTK1xiLnswLHskb2Zmc2V0fX0vdWkiLAoJCSdkZXNjcicgPT4gJ9Cd0LXRgiDQv9GA0L7QsdC10LvQsCDQv9C+0YHQu9C1INC30LDQv9GP0YLQvtC5LCDRgtC+0YfQutC4INGBINC30LDQv9GP0YLQvtC5LCDQstC+0YHQutC70LjRhtCw0YLQtdC70YzQvdC+0LPQviDQt9C90LDQutCwLCAnLgoJCQkJCSfQstC+0L/RgNC+0YHQuNGC0LXQu9GM0L3QvtCz0L4g0LfQvdCw0LrQsCwg0LTQstC+0LXRgtC+0YfQuNGPLicsCgldLAoJWwoJCSdyZWdFeHAnID0+ICIvLnswLHskb2Zmc2V0fX1cYlx3KlvQttGIXdGLXHcqXGIuezAseyRvZmZzZXR9fS91aSIsCgkJJ2Rlc2NyJyA9PiAn0JbQuC/RiNC4INC90LDQv9C40YHQsNC90L4g0YfQtdGA0LXQtyAi0YsiLicsCgldLAoJWwoJCSdyZWdFeHAnID0+ICIvLnswLHskb2Zmc2V0fX1cYtC60L7QvtGA0LTQuNC90LDQu9GM0L3QvlxiLnswLHskb2Zmc2V0fX0vdWkiLAoJCSdkZXNjcicgPT4gJ9Ce0YjQuNCx0LrQsCDQsiDRgdC70L7QstC1ICLQutCw0YDQtNC40L3QsNC70YzQvdC+LiInLAoJXSwKCVsKCQkncmVnRXhwJyA9PiAiLy57MCx7JG9mZnNldH19XGIo0YHQtNC10YHRjHzQt9C00LXQu9Cw0L180LfQtNC10LvQsNGOKVxiLnswLHskb2Zmc2V0fX0vdWkiLAoJCSdkZXNjcicgPT4gJ9Cd0LXQv9GA0LDQstC40LvRjNC90LDRjyDQv9GA0LjRgdGC0LDQstC60LAgYy0v0LctLicsCgldLAoJWwoJCSdyZWdFeHAnID0+ICIvLnswLHskb2Zmc2V0fX1bXixdXHNcYijQvdC+fNCwKVxiLnswLHskb2Zmc2V0fX0vdWkiLAoJCSdkZXNjcicgPT4gJ9Cf0YDQvtC/0YPRidC10L3QsCDQt9Cw0L/Rj9GC0LDRjyDQv9C10YDQtdC0INC/0YDQtdC00LvQvtCz0L7QvCAi0LAiINC40LvQuCAi0L3QviIuJywKCV0sCl07CgokdGV4dCA9ICfQotGD0YIg0LrQvtC+0YDQtNC40L3QsNC70YzQvdC+INC/0YDQvtC/0YPRidC10L0g0L/RgNC+0LHQtdC7LNC/0L7RgdC70LUg0LfQsNC/0Y/RgtC+0Lkg0L3QviDQv9C10YDQtdC0INGC0L7Rh9C60L7QuScuCgkJJ9Ch0LvQvtCy0L4g0L/Rg9GI0YvRgdGC0YvQuSDRgdC00LXRgdGMINC90LDQv9C40YHQsNC90L4g0YEg0L7RiNGL0LHQutC+0LkuJzsKCmZvcmVhY2ggKCRwb3NzaWJsZUVycm9ycyBhcyAkZXJyb3IpIHsKCSRtYXRjaGVzID0gW107CglwcmVnX21hdGNoX2FsbCgkZXJyb3JbJ3JlZ0V4cCddLCAkdGV4dCwgJG1hdGNoZXMpOwoJZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJG1hdGNoKSB7CgkJZWNobyAkZXJyb3JbJ2Rlc2NyJ10gLiAiINCc0LXRgdGC0L4g0YEg0L7RiNC40LHQutC+0Lk6IFxuPj4geyRtYXRjaH1cblxuIjsgCgl9Cn0K