Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вытащить номера договоров
 
 автор: dirol   (13.05.2015 в 12:26)   письмо автору
 
 

Помогите доделать, нашел тут на форуме регулярный код для подсветки номеров договоров

$y['docs']='Оплта по счету N СЮ 000000346 от 28.01.2015г.Без НДС.

Оплата по счету N7447-МЮ от 28.01.2015г.Без НДС.

Оплата первого взноса по дог. займа №2901/1353-СК от 29.01.2015 Общая сумма займа 3000,00 по сч. №7457-ПП от 29.01.2015 Без НДС  просто номер №СЮ000000167

Погашение займа по договору № 3001/ББ-0002 от 30.01.2015 Сумма 8333-33 Без налога (НДС)';

$pattern = "|(№\d+\S*)|s";
  $replacement = "<b>\${1}</b>";
  $string = $y['docs'];
 echo $d= preg_replace($pattern, $replacement, $string);


он да работает когда в номере договора есть № а у меня в документах есть и N и n слитно и раздельно, и даже блин вот так пишут NoУ/10.06/89-СК и вот так даже пишут №СЮ000000167, и код уже не срабатывает

  Ответить  
 
 автор: Lawconomist   (14.05.2015 в 16:58)   письмо автору
 
   для: dirol   (13.05.2015 в 12:26)
 

Ваш код дословно ищет и выделяет следующее: "знак №, сразу после которого идёт одна и более цифр, далее может идти любое количество непробельных символов (а может и не идти)" .

(Кстати не понимаю зачем указан модификатор s, согласно мануалу он влияет только на действие символа "."(точка), которого в данном выражении нет. Старшие товарищи поправят, если я чего-то не понимаю.)

Теперь к вашему вопросу. Добавить альтернативу N к № достаточно просто, выражение будет иметь следующий вид:
!([№|N]\d+\S*)!u
(модификатор "u" добавлен для поддержки Юникода, если у вас однобайтная кодировка типа Windows-1251, его можно опустить).

Чтобы выделялись номера договоров не только с цифрами после № или N, а со всеми непробельными символами (буквы, цифры, тире, слеши и т.д.) приводим выражение в следующий вид:
!([№|N]\S*)!u

Однако это не решает проблему договоров, где после № или N идёт пробел. Для этого добавляем в выражение опционный пробел после альтернативы № или N:
!([№|N]\s?\S*)!u

Однако это не решает проблему договоров типа N СЮ 000000346, где пробелом разделены части номера договора (которые могут быть как буквенными, так и числовыми или смешанными). Поскольку номера договоров по законодательству имеют произвольную форму (насколько я знаю), это сделать невозможно. "Интерпретатору" регулярных выражений в строке N СЮ 000000346 от 28 не объяснить где число относится к номеру договора, а где это уже просто часть даты в предложении.

  Ответить  
 
 автор: Sfinks   (14.05.2015 в 21:54)   письмо автору
 
   для: Lawconomist   (14.05.2015 в 16:58)
 

Все это не стоит пытаться объеденить под один шаблон. Себе дороже будет.
Делая столько допущений, вы кроме добавления вариантов нумерации, добавляете и другие совпадения.
Сперва нужно заняться анализом и выбрать все типы нумерации договоров.
Затем под каждый тип составить довольно строгое выражение.
Потом просто все их объединить через |

ЗЫ. Автор, ограничивать РВ управляющим символом | - не лучшая идея. Лучше взять что-то нейтральное, например # или привычное /

  Ответить  
 
 автор: Deed   (15.05.2015 в 16:55)   письмо автору
 
   для: dirol   (13.05.2015 в 12:26)
 

http://codepad.org/huqNqUcp


<?php
$y
['docs']='Оплта по счету N СЮ 000000346 от 28.01.2015г.Без НДС.

Оплата по счету N7447-МЮ от 28.01.2015г.Без НДС.

Оплата первого взноса по дог. займа №2901/1353-СК от 29.01.2015 Общая сумма займа 3000,00 по сч. №7457-ПП от 29.01.2015 Без НДС  просто номер №СЮ000000167

Погашение займа по договору № 3001/ББ-0002 от 30.01.2015 Сумма 8333-33 Без налога (НДС)'


$y_arr=explode('от',$y['docs']);
$y_arr_1=explode('счету',$y_arr[0]);
$num=trim($y_arr_1[1]);
$num_hl='<span style="background-color:yellow">'.$num.'</span>';

echo 
str_replace($num,$num_hl,$y['docs']);
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования