Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите написать регулярку [3]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 2 [3]   

> Без описания
isle
Отправлено: 11 Января, 2010 - 21:31:57
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Я уже чуток поднатаскался за пару недель, могу предложить свой вариант, надеюсь, поможет:

'|(?:\d{0-3}\s*(\.|,)\s*\d{0-3}\s*(\.|,)\s*\d{0-3}\s*(\.|,)\s*\d{0-3}\s*(\.|,)\s*)|s','-',$text

(Отредактировано автором: 11 Января, 2010 - 21:33:49)

 
 Top
apakc
Отправлено: 11 Января, 2010 - 21:41:54
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




к сожалению нет
CODE (text):
скопировать код в буфер обмена
  1. сегодня вышла в свет сборка кодеков версии 4.12с скачать ее можно по адресу 10 . 56 . 84 . 119
  2. -с-е-г-о-д-н-я- -в-ы-ш-л-а- -в- -с-в-е-т- -с-б-о-р-к-а- -к-о-д-е-к-о-в- -в-е-р-с-и-и- -4-.-1-2-с- -с-к-а-ч-а-т-ь- -е-е- -м-о-ж-н-о- -п-о- -а-д-р-е-с-у- -1-0- -.- -5-6- -.- -8-4- -.- -1-1-9-

1. исходная строка
2. результат |(?:\d{0-3}\s*(\.|,)\s*\d{0-3}\s*(\.|,)\s*\d{0-3}\s*(\.|,)\s*\d{0-3}\s*(\.|,)\s*)|s

p.s. добавлю что ip адрес может находиться где угодно. не только в конце
p.p.s. я так думаю надо от вырезания простого IP плясать, наращивая мусор
p.p.p.s. результатом пример должна быть строка "сегодня вышла в свет сборка кодеков версии 4.12с скачать ее можно по адресу"

(Отредактировано автором: 11 Января, 2010 - 21:43:59)

 
 Top
isle
Отправлено: 11 Января, 2010 - 22:02:26
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Ну, текст совсем другой Улыбка Тогда попробуйте такую регулярку:

$del = "[\s*-?\s*-?\d-?\s*-?\d?-?\s*-?\d?-?\s*-?\s*]";

'|(?:'.$del.'(?:\.|,)'.$del.'(?:\.|,)'.$del.'(?:\.|,)'.$del.'(?:\.|,)\s*)|s','-',$text


Под ваш пример, должна заработать по идее. Но, может, чего гуру и другие форумчане еще подскажут.

П.С. М... скопировал и не посмотрел, нужно так:
вместо \d{0-3} написать \d{0,3} - так правильно...
 
 Top
apakc
Отправлено: 13 Января, 2010 - 16:48:54
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Не работает Недовольство, огорчение
В общем плохая затея вылавливать такие плохие IP адреса...
Вопрос следующий можно ли с помощью регулярного выражения оставить в исходной строке "сегодня вышла в свет сборка кодеков версии 4.12с скачать ее можно по адресу 10 . 56 . 84 . 119" куски типа 4.12с, т.е. шаблон ХХ.ХХ где Х числа, а все что не состоит в таком шаблоне и является цифрой убить?

глупый вопрос, но может я опять чего-то не понимаю Растерялся
 
 Top
isle
Отправлено: 13 Января, 2010 - 17:14:41
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




apakc пишет:
Не работает
apakc пишет:
Не работает


Должна, регулярку вам правильно дал, уверен в этом... Сам их уже почти с сотню для своего чекера наклепал, очень длинных и сложных - все работают. Может, вы опять чего-то недоговорили, как в прошлый раз ? Улыбка П.С. Я с ерегами пока не работал еще, их не знаю, если честно, а вот преги знаю уже хорошо, попробуйте с ними... у меня все путем работает ;)

Цитата:
можно ли с помощью регулярного выражения...


Можно. Можно выкинуть, например, все цифры, все англ. буквы, только определенные цифры или только заглавные буквы и т.д.

Вообще, все посторонние символы можно удалить из любой строки. В примере выше можно очистить вашу строку было бы от мусора, например, символов "-", что было бы правильней, а также все запятые поменять на точки. Для этого есть замечательная штука - прег_реплейс, я сначала им обрабатываю строку, а потом вытаскиваю то, что мне нужно, так проще и быстрее, но удобство появляется только если строка чертовски сложная и длинная. Попробуйте... Примерно это выглядит так:

вытаскиваем нашу строку из сайта и обрабатываем:

PHP:
скопировать код в буфер обмена
  1. // Наше выражение, которое нужно обработать
  2. $html = file_get_contents($url);
  3.  
  4. // Задаем массив левых символов, которые нужно удалить.
  5. $del = array('-','--');
  6. $html = str_replace($del,'',$html);
  7.  
  8. // Можно удалить один символ или одну последовательность символов так...
  9. // Это работает быстрей и не грузит сервер в отличие от preg_replace.
  10. $html = str_replace(' ',' ',$html);
  11.  
  12. // Меняем все запятые на точки
  13. $html = str_replace(',','.',$html);
  14.  
  15. // Удаляем только цифры из строки:
  16. $del = array('0','1','2','3','4','5','6','7','8','9');
  17. $html = str_replace($del,'',$html);


Дальше уже, думаю, всё понятно из логики Улыбка Если не получилось что-то, то дайте конкретные несколько примеров... Должно всё работать.


Отредактировано модератором: movEAX, 18 Января, 2010 - 18:17:15
 
 Top
leshiy_SV
Отправлено: 20 Января, 2010 - 15:11:31
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




Всем доброго времени. В регулярных выражениях не силен и идей по данному случаю вообще нет. Поэтому прошу помощи, нужно из Иванов С. В. и Под ред. Иванова С. В. и подобных выражениях выдернуть буквы Ив, т.е. первые две буквы из фамилии.
 
 Top
vitaliy_mad
Отправлено: 20 Января, 2010 - 15:20:47
Post Id


Участник


Покинул форум
Сообщений всего: 1107
Дата рег-ции: Окт. 2008  
Откуда: Украина, Мариуполь


Помог: 0 раз(а)




Здесь регулярка не нужна...

PHP:
скопировать код в буфер обмена
  1. $str=str_replace('Под ред. ','',$str);
  2. $lit=substr($str,0,2);// Здесь будет результат.
  3.  

(Отредактировано автором: 20 Января, 2010 - 15:21:16)

 
 Top
Champion Супермодератор
Отправлено: 20 Января, 2010 - 16:29:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




/([А-Я][а-я])[а-я]+ [А-Я]\. [А-Я]\./ Это если фамилии везде идут с инициалами. Если с кироиллицей проблеммы получатся, надо подсмотреть где-нибудь коды символов
(Добавление)
И написать их вместо букв вот так: \xXX
 
 Top
biperch
Отправлено: 23 Января, 2010 - 21:28:40
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




 
 Top
leshiy_SV
Отправлено: 12 Февраля, 2010 - 14:50:26
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




решил сделать так, чтобы получить нужную букву перед ней ставить знак !.
посмотрите на регулярку правильно ли написано
PHP:
скопировать код в буфер обмена
  1.  
  2. $str="Под ред. !Иванова С.В.";
  3. $result = preg_match("/!(.?)/",$str,$found);
  4.  

в итоге выдает массив Array ( [0] => !И [1] => И ).

(Отредактировано автором: 13 Февраля, 2010 - 11:34:30)

 
 Top
isle
Отправлено: 12 Февраля, 2010 - 15:42:10
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




leshiy_SV пишет:
решил сделать так, чтобы получить нужную букву перед ней ставить знак !.


Не понятно, зачем вам велосипед с 4-мя колесами? Улыбка Выше есть пример в 2 строчки.

CODE (htmlphp):
скопировать код в буфер обмена
  1. $str=str_replace('Под ред. ','',$str);
  2. $lit=substr($str,0,2);
  3. echo $lit;


А в случае с прегами (preg_) выдается масив (aray), чтоб его распечатать, нужно указать, какой именно элемент массива нужен. Если нет круглых скобок - элемент массива только 1 - $array[0], если есть хоть одна пара круглых скобок, то эти самые скобки (их содержимое) заносится в элемент 2 - $array[1] и т.д. Т.е. нужно выводить так:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $str="Под ред. !Иванова [С].В.";
  2. $result = preg_match("/!(.?)/",$str);
  3. $result = $found[1]; echo $result;


А вообще регулярка неправильная. В данном случае можно написать так (если проблемы с кирилицей:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $match = '|[^\s]*\s[^\.\s]*\.\s([.*?]{2}).*?|si';
  2. preg_match($match,$str,$found);
  3. $result = $found[1];
  4. echo $result;


Если $str="Под ред. !Иванова [С].В.", то будет работать.
Также, если проблемы с кодировкой, то есть функция icon: сначала преобразуйте ее из утф8 в сп-1251, сделайте необходимые операции , затем опять преобразуйте для вывода или пишите сразу документ редактором, который сохраняет в утф8.

В общем, пока вы не определитесь что именно вам надо, трудно будет определиться как это лучше сделать Улыбка Надеюсь, помог.
 
 Top
leshiy_SV
Отправлено: 13 Февраля, 2010 - 09:22:13
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




isle пишет:
Не понятно, зачем вам велосипед с 4-мя колесами? Улыбка Выше есть пример в 2 строчки.
потому что одним выражением
не отделаешься, тут может быть несколько вариантов и все их нет возможности учесть. к тому же если авторы будут зарубежные, а там как кажется у них вначале идет имя а потом фамилия. И как это тогда учесть? Да так же и в русских, если кто то напишет вначале имя и отчество а потом фамилию, причем полностью как тогда быть?
Поэтому я не нашел другого никакого способа, кроме как напрямую указывать фамилию знаком !. если есть другие способы я с удовольствием попробую, но пока ничего подходящего не нашлось
isle пишет:
А вообще регулярка неправильная. В данном случае можно написать так (если проблемы с кирилицей:
почему неправильно? она хотя бы выводит правильный результат. А ваша
isle пишет:

$match = '|[^\s]*\s[^\.\s]*\.\s([.*?]{2}).*?|si';
preg_match($match,$str,$found);
$result = $found[1];
echo $result;
что то у меня ничего не выводит, массив $found пустой Однако
 
 Top
isle
Отправлено: 13 Февраля, 2010 - 11:09:35
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




А... понятно... у вас сложный вывод данных. В таком случае, нужно хотябы примеров 5-10, чтоб можно было составить маску с большой вероятностью совпадений и использовать, возможно, проверку нескольких масок, их массив.

Поскольку я не особо представляю как и что у вас там может выводиться (но суть ясна теперь), предлагаю сделать массив мусора из всех возможных вариантов, например, введите 5-10 вариантов совпадений, которые нужно удалить, а далее регуляркой уже проще будет пройтись по более простой маске и с вероятностью до 100% вытащить результат.

Примерный вариант удаления мусора.

CODE (htmlphp):
скопировать код в буфер обмена
  1. \\Delete trash
  2. $del = array (
  3.   '|Под ред.|si',
  4.   '|Под редакцией|si',
  5.       ...
  6.   '|Автор|si',
  7.   '|Автор книги|si',
  8.   '|Autor|si',
  9.   '|Autor this book|si'
  10. );
  11. $out = preg_replace($del,'',$in);


После такой предварительной обработки далее выборку делать будет проще. Можно для регулярок также создать массив из нескольких вариантов и пройтись через цикл, либо создать мега-универсальную регулярку на все случаи жизни, но нужно примеры ваши глянуть, чтоб на угад не писать.

П.С. "Под ред. !Иванова [С].В." - квадратные (возможно, круглые тоже) скобки могут присутствовать или это опечатка? Если этот мусор тоже есть, то и его нужно удалить (его вставить позже в результат всегда можно):

CODE (htmlphp):
скопировать код в буфер обмена
  1. \\Delete trash
  2. $del2 = array (
  3.   '(', ')',
  4.       ...
  5.   '[', ']',
  6. );
  7. $out = str_replace($del2,'',$in);


После обработки должно остаться только что-то типа: "Иванова С.В." или "С.В. Иванова". Обработать это дело уже не сложно: буква+точка, буква+точка и слово, с которого вырезаем только первые 2 (или 3-4, если англ.) буквы по регулярке. Если могут быть запятые или другие знаки (тире, например), преобразуйте их в точки, чтоб привести к единой упрощенной маске с помощью str_replace().
 
 Top
leshiy_SV
Отправлено: 13 Февраля, 2010 - 11:37:21
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Окт. 2009  
Откуда: Пятигорск


Помог: 0 раз(а)




isle пишет:
П.С. "Под ред. !Иванова [С].В." - квадратные (возможно, круглые тоже) скобки могут присутствовать или это опечатка?
это опечатка их вообще не должно быть. просто в начале я хотел, выделить первую букву фамилии квадратными скобками (просто экспериментировал). а потом решил что проще указать просто каким нибудь символом саму фамилию, а потом просто убрать его
 
 Top
Страниц (3): « 1 2 [3]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB