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
Форумы портала PHP.SU :: Версия для печати :: Помогите распарсить текст
Форумы портала PHP.SU » PHP » Регулярные выражения » Помогите распарсить текст

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

1. Delovoy - 26 Января, 2011 - 19:36:48 - перейти к сообщению
Парсю следующий текст следующим методом:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         $text = '<p style="margin-bottom:6px; margin-top:2px; text-indent:0px;margin-left:10px">
  3.                <a href="/streets/588.htm" title="" style="text-indent:0px;margin:0px;pading:0px; font-size:12px; ">
  4.                1.
  5.                Александровская
  6.                </a>
  7.                <!-- ( Пригород
  8.                , )
  9.                -->
  10.                <br>
  11.                <p style="margin-bottom:6px; margin-top:2px; text-indent:0px;margin-left:10px">
  12.                <a href="/streets/577.htm" title="" style="text-indent:0px;margin:0px;pading:0px; font-size:12px; ">
  13.                2.
  14.                Андрющенко
  15.                </a>
  16.                <!-- ( Пригород
  17.                , )
  18.                -->
  19.                <br>
  20.                <p style="margin-bottom:6px; margin-top:2px; text-indent:0px;margin-left:10px">
  21.                <a href="/streets/723.htm" title="" style="text-indent:0px;margin:0px;pading:0px; font-size:12px; ">
  22.                3.
  23.                Б.Житомирская
  24.                </a>
  25.                <!-- ( Пригород
  26.                , )
  27.                -->
  28.                <br>';
  29.  
  30.  
  31.         preg_match_all("/[а-яА-Я.]{2,}/u", $text, $out_arr);
  32.         print_r($out_arr);
  33.         ?>


Результат почти получился верным
CODE (html):
скопировать код в буфер обмена
  1. Array ( [0] => Array ( [0] => Александровская [1] => Пригород [2] => Андрющенко [3] => Пригород [4] => Б.Житомирская [5] => Пригород ) )


Как из результатов убрать повторяющийся элемент "Пригород" ?
2. movEAX - 26 Января, 2011 - 20:10:11 - перейти к сообщению
array_unique
3. dima4321 - 26 Января, 2011 - 20:17:26 - перейти к сообщению
Он ни это имел ввиду

а вот это

CODE (htmlphp):
скопировать код в буфер обмена
  1. preg_match_all('/^\s+[а-я.]+/mi',$m,$match);
  2.                            
  3.                            print_r($match);
4. Delovoy - 27 Января, 2011 - 10:10:17 - перейти к сообщению
Спасибо movEAX, это немного не то, но думаю еще пригодится !

Спасибо, dima4321!
Работает ! Улыбка

Я правильно понял:
модификатор m - устанавливает обработку текста как многострочного
модификатор i - убирает регистрозависимость

^\s - выражение должно начинаться с пробела или символа перевода строки
^\s+ - выражение должно начинаться с пробела или символа перевода строки и символ должен быть один или более ?
[а-я.] класс символов, которые может содержать выражение
[а-я.]+класс символов, которые может содержать выражение и символ должен быть один или более ?
5. Uchkuma - 27 Января, 2011 - 10:25:40 - перейти к сообщению
Delovoy пишет:
Я правильно понял:
Правильно.
С модификатором m каждая строка будет рассматриваться в отдельности, поэтому вхождение Пригород не попадает в результаты поиска, т.к. находится не в начале строки с учетом начальных пробельных символов, что не соответствует шаблону.
(Добавление)
Кстати, в зависимости от содержимого, данный шаблон не даст 100% верный результат. С точки зрения логики, вам необходимо выбирать вхождения, начинающиеся после цифры с точкой до первой открывающейся угловой скобки.
6. JustUserR - 27 Января, 2011 - 10:37:52 - перейти к сообщению
Delovoy В качестве возможного варианта решения предполагаемой задачи допустимо исопльзование средств XML-анализатора позволяющег обеспечить извлечение отдельныъ элементов и их параметров из оригинального документа - на основе предоставления явного вложенного пути к целевому элементу или критерия его поиска в XML-документе
Использование средств XML-анализатора для решения предполагаемой задачи в действительности является в значительной мере более эффективным решением обеспечиваемого за счет проведения разбора XML-документа в компиированном коде соответствующих модулей
Более подробная информация по данному вопросу предоставлена здесь http://www.php.su/functions/?page=cat_xml
7. Delovoy - 27 Января, 2011 - 10:56:49 - перейти к сообщению
Uchkuma пишет:
Кстати, в зависимости от содержимого, данный шаблон не даст 100% верный результат. С точки зрения логики, вам необходимо выбирать вхождения, начинающиеся после цифры с точкой до первой открывающейся угловой скобки.

Да, все верно! Сейчас как раз "сражаюсь" с конструкцией такого регулярного выражения

JustUserR пишет:
Более подробная информация по данному вопросу предоставлена здесь http://www.php.su/functions/?page=cat_xml

Это тоже верно очень много полезной информации ..ОЧЕНЬ МНОГО Улыбка
Дайте конкретный совет чем пользоваться, а еще лучше конкретный пример реализации описанной мной задачи.
Лучше всего я обучаюсь на примерах, если Ваша цель на этот форуме, рально помочь. Спасибо Улыбка
8. JustUserR - 27 Января, 2011 - 11:07:28 - перейти к сообщению
Delovoy пишет:
Дайте конкретный совет чем пользоваться, а еще лучше конкретный пример реализации описанной мной задачи.
Лучше всего я обучаюсь на примерах, если Ваша цель на этот форуме, рально помочь. Спасибо
Пожалуйста! Предоставленный источник информации в действительности включает сведениях о всех распространных средствах позволяющих осуществять анализ XML-документов в PHP-приложениях - однако оптимальным вариантом для решения данной задачи может являться модуль simplexml конкретная информация о котороом предоставлена здесь http://www.php.su/functions/?cat=simplexml - обеспечивающей трактования идентификаторов загружаемого XML-документ на уровне программных элементов что реализуется средствами управление хранимыми элементами программного потока
Практические примеры предоставлены здесь http://www[dot]amway-shop[dot]ru/article[dot][dot][dot]/article249[dot]html и здесь http://www[dot]ibm[dot]com/developerwork[dot][dot][dot]9&S_CMP=GR01
9. Uchkuma - 27 Января, 2011 - 11:10:45 - перейти к сообщению
Delovoy пишет:
Сейчас как раз "сражаюсь" с конструкцией такого регулярного выражения
Такая конструкция должна подойти:
CODE (regexp):
скопировать код в буфер обмена
  1. /\d\.\s+([а-я\s.]+)/i

Если названия всегда являются ссылками, то можно использовать такую конструкцию:
CODE (regexp):
скопировать код в буфер обмена
  1. /<a [^>]+>\s*\d+\.\s*([а-я\s.]+)\s*</a>/i
10. JustUserR - 27 Января, 2011 - 11:20:52 - перейти к сообщению
Uchkuma пишет:
Такая конструкция должна подойти
Для осуществленя корректного функционирования регулярных выражений включающих региональные элементы в шаблонах - необходимо обеспечение сопоставления кодовой таблицы представления информаицинных полей в потоке исполнения PHP-приложения и данных получаемог XML-документа
11. Delovoy - 27 Января, 2011 - 12:04:05 - перейти к сообщению
Я изменил конструкцию следующим образом

PHP:
скопировать код в буфер обмена
  1. preg_match_all("/\s+[0-9.]+\s+([а-я.].+[а-я.]+)/iu", $text, $out_arr);


в результате получил, то что хотел
(даже попали в отбор такие звери, как:
Владимиро-Лыбедская и Житомирская Ивановская пл.) Улыбка

CODE (html):
скопировать код в буфер обмена
  1. Array ( [0] => 1. Александровская [1] => 2. Андрющенко [2] => 3. Б.Житомирская Ивановская )


остался вопрос как в начале отрезать цифру с номером и пробелом, но при этом чтобы она осталась как условие поиска ?

и при значении метро "Дворец Украина" в результат попадает
метро "Дворец Украина - т.е. отсутствует последняя ковычка, но присутствует первая ...


А при записи в БД получается вообще что-то интересное
метро &quot;Дворец Украина
(модераторы, сорри что не по теме про базы данных, но чтобы в одном обсуждении уже все вопросы решить)
12. dima4321 - 27 Января, 2011 - 19:13:33 - перейти к сообщению
отрезать цифру с точкой можно по разному. Например воспользоваться строковыми функциями при переборе массива
как вариант
http://php.su/functions/?substr

т.е.
CODE (htmlphp):
скопировать код в буфер обмена
  1. foreach($match as $value)// или $match[0]
  2.  
  3. {
  4.  echo substr($value, 4);
  5. }


а можно и preg_replace пройти вариантов масса.))

если эта регулярка работает

preg_match_all("/\s+[0-9.]+\s+([а-я.].+[а-я.]+)/iu", $text, $out_arr);

то так:

preg_match_all("/\s+(?:[0-9.]+)\s+([а-я.].+[а-я.]+)/iu", $text, $out_arr);

(?: )конструкция не попадает в результирующий массив. Т.е. скобки не запоминаются при выводе массива
13. Uchkuma - 27 Января, 2011 - 20:36:31 - перейти к сообщению
Delovoy пишет:
остался вопрос как в начале отрезать цифру с номером и пробелом, но при этом чтобы она осталась как условие поиска
Прочитать описание функции. Подмаску надо использовать. Т.е. круглые скобки. Смотрите мой пример.
14. JustUserR - 29 Января, 2011 - 23:35:26 - перейти к сообщению
Delovoy пишет:
А при записи в БД получается вообще что-то интересное
метро &quot;Дворец Украина
Формирование целевого информационного поля запись которого осуществляется в таблицы базу данных предполагает обеспечения конвертации уровня элементноо трактования сохраняемых данных относительно контейнерной константы в оригинальной запросе и разделительных элементов в объекте хранения - в частности получение указанной формы записи свидетельствует об осуществлении просмотра содержимого БД вне приложений отображения HTML-элементов - или при сохранении было произведено повтрная операция мнемонирования управляющих HTML-элементов
15. Delovoy - 31 Января, 2011 - 10:02:33 - перейти к сообщению
Спасибо всем за помощь! Все получилось! )))

Отдельное спасибо
JustUserR пишет:
за анализ XML-документов в PHP-приложениях
Подмигивание

 

Powered by ExBB FM 1.0 RC1