Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: reg_exp помогите найти ошибку, в online проверке ошибок нет.  (Прочитано 772 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kostryukov

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1588
  • everybody lies
    • Просмотр профиля
    • kostryukov.net
Есть строка:
Цитировать
/table></TD><TD Class="ms-vb2">конъюнктура 2 (розница)</TD><TD Class='ms-vb2'><NOBR>

Есть регулярка:
/(?<=\">)[А-Яа-я,\s,\w,\t,\d,\(,\),\-,\_]*(?=<\/TD><TD)/
Должен получить:
конъюнктура 2 (розница)

Проверяю на сайте http://regexpr.ru/ - Ошибок нет.

В php же следующее:
$str = "/table></TD><TD Class=\"ms-vb2\">1-конъюнктура (розница)</TD><TD Class=\"ms-vb2\"><NOBR>";
preg_match_all('/(?<=vb2\">)[А-Яа-я,\s,\w,\t,\d,\(,\),\-]*(?=<\/TD><TD)/', $str, $name);

print_r($name);


Array
(
    [2] => Array
        (
        )

)

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

$str2 = "/table></TD><TD Class=\"ms-vb2\">1П-5 м(вв)</TD><TD Class=\"ms-vb2\"><NOBR>";
preg_match_all('/(?<=vb2\">)[А-Яа-я,\s,\w,\t,\d,\(,\),\-]*(?=<\/TD><TD)/', $str2, $name);

print_r($name);

Array
(
    [2] => Array
        (
            [0] => 1П-5 м(вв)
        )

)


КАК так ??
Что за чудеса, пол дня голову ломаю :o

Пользователь решил продолжить мысль 03 Апреля 2012, 21:54:24:
пришлось делать так:
/(?<=vb2\">)[A-Za-z,А-Яа-я,\w,\s,\w,\t,\d,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я\(,\),\-]*(?=<\/TD><TD)/
что определил, ошибка была из за символов "р", "т", "щ", дальше не проверял.

с символами "а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п" - ошибки не наблюдается.

Проблема решена, но вопрос не закрыт.
« Последнее редактирование: 03 Апреля 2012, 21:54:24 от kostrukov »
у меня можно спросить=)

Оффлайн Tonal

  • Любитель
  • *
  • Сообщений: 82
  • Карма Кагью
    • Просмотр профиля
А зачем там громоздить класс, когда можно просто точку?
/(?<=\">).*(?=<\/TD><TD)/Или, если уж с классом хочешь, так:
/(?<=\">)[^<]*(?=<\/TD><TD)/Вообще с классами символов (то что между []) у тебя недопонимание походу - почитай хорошенько. :)

П. С. Ну а с конкретными буковками - это кодировки. Нужно отдельным образом разбираться. :)

Оффлайн kostryukov

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1588
  • everybody lies
    • Просмотр профиля
    • kostryukov.net
/(?<=\">).*(?=<\/TD><TD)/У меня не одна строка, их много, и этот вариант никак не подходит.
п.с. Да в пример приведена одна строка, дабы показать проблему.

/(?<=\">)[^<]*(?=<\/TD><TD)/Так и сделал, с утра, на свежую голову, вчера уперся в эти символы))

Цитировать
П. С. Ну а с конкретными буковками - это кодировки. Нужно отдельным образом разбираться.

ну а что там с ними не так?
одну букву воспринимает, другую (этой же кодировки) - не воспринимает.
вот именно в этом и хочется разобраться
у меня можно спросить=)

andrey_p

  • Гость
www.perl.com:
Цитировать
Perl guru Tom Christiansen created and maintains a list of 44 recipes for working with Unicode in Perl 5. Perl.com is pleased to serialize this list over the coming weeks.

С utf-8 часто можно работать, как с обычными байтовыми строками. Но не всегда.

 

Страница сгенерирована за 0.104 секунд. Запросов: 25.