звонок2'; $r = (new HtmlPhoneScanner)->scan($html); expect($r['code'])->toHaveKey('78432032533') ->and($r['code']['78432032533'])->toContain('tel') ->and($r['code'])->toHaveKey('78432452533'); }); it('берёт номера из schema.org и microdata', function () { $html = '' .'x'; $r = (new HtmlPhoneScanner)->scan($html); expect($r['code']['78432032533'])->toContain('schema') ->and($r['code']['78432452533'])->toContain('microdata'); }); it('считает вхождения в тело и берёт e-mail-цифры', function () { $html = 'тел 8(843)203-25-33, ещё 8(843)203-25-33. почта 2032533@mail.ru'; $r = (new HtmlPhoneScanner)->scan($html); expect($r['body']['78432032533'])->toBe(2) ->and($r['emails'])->toContain('2032533'); }); it('достраивает короткий локальный номер кодом города со страницы', function () { // на странице есть полный номер с кодом 391 (Красноярск) → код города = 391; // короткий локальный 271-33-33 (7 цифр, без кода) НЕ выкидываем, а достраиваем до 73912713333 $html = 'главный' .'филиал'; $r = (new HtmlPhoneScanner)->scan($html); expect($r['code'])->toHaveKey('73912713333') ->and($r['code'])->toHaveKey('73912000000'); }); it('достраивает короткий номер кодом региона, когда на странице нет полного', function () { // на странице ТОЛЬКО короткий 281-00-00, полных номеров нет → берём код города из запроса (391) $html = 'единственный'; $r = (new HtmlPhoneScanner)->scan($html, '391'); expect($r['code'])->toHaveKey('73912810000'); }); it('достройка не привязана к региону: работает для любого кода города', function () { // Москва (495): код города берётся со страницы, никакой привязки к Красноярску $msk = (new HtmlPhoneScanner)->scan( 'офисфилиал' ); expect($msk['code'])->toHaveKey('74957712233'); // Санкт-Петербург (812): тот же механизм, другой код $spb = (new HtmlPhoneScanner)->scan( 'офисфилиал' ); expect($spb['code'])->toHaveKey('78126405566'); // запасной код региона из запроса — тоже любой (Екатеринбург 343) $ekb = (new HtmlPhoneScanner)->scan('единственный', '343'); expect($ekb['code'])->toHaveKey('73433556677'); }); it('НЕ слепляет фальшивку из обрезка полного номера (страна+код)', function () { // Сайт делит номер на 2 tel:-ссылки: «+7 (391) 271» (обрезок) и «271-33-33» (локальная часть). // Обрезок 7391271 начинается с 7+391 → это кусок полного номера, достраивать его НЕЛЬЗЯ. // Локальную часть 271-33-33 достраиваем кодом 391 со страницы. $html = 'главный' .'обрезок' .'локальная часть'; $r = (new HtmlPhoneScanner)->scan($html); expect($r['code'])->toHaveKey('73912713333') // локальная часть достроена верно ->and($r['code'])->toHaveKey('73912000000') // полный ->and($r['code'])->not->toHaveKey('73917391271') // фальшивка из обрезка НЕ появилась ->and($r['uncertain'])->not->toContain('7391271'); // и в «требует проверки» обрезок не лезет }); it('короткий номер без кода города НЕ теряет, а помечает «требует проверки»', function () { // ни полных номеров на странице, ни кода региона → нельзя достроить, но и терять нельзя $html = 'филиал'; $r = (new HtmlPhoneScanner)->scan($html); expect($r['code'])->toBeEmpty() ->and($r['uncertain'])->toContain('2713333'); });