Автор Тема: Помогите с регулярным выражением  (Прочитано 4590 раз)

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

Оффлайн 017

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Мужики! Очень нужно вычислить, встречается ли символ \';\' в конце строки (1 и более раз). Но условие не должно выполняться, если \';\' встречается в середине (т.е. ааа_ббб;; - true, а например ааа;ббб;;; - уже false потому как \';\' присутствует в середине строки). Для нахождения этого условия использую следующую конструкцию:

          ereg ("([^\\;]+;+$)")

Результат выполнения всегда false.  Обращаюсь ко всем за помощью!

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
Помогите с регулярным выражением
« Ответ #1 : 31 Июля 2002, 13:05:20 »
Сам в регах мало понимаю обычно подправляю чужие.
Вот ссылка:
http://php.spb.ru/php/regexp.html

И чаще пользуйся preg.
Вот ещё ссылка:
http://php.spb.ru/php/speed.html
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн GotZfild

  • Универсал
  • Старожил
  • ****
  • Сообщений: 456
  • +0/-0
  • 2
    • Просмотр профиля
    • http://myphp.dem.ru
Помогите с регулярным выражением
« Ответ #2 : 31 Июля 2002, 13:24:42 »
Тут регулярки даже не нужны

$str 
";aaabbb;;;";
if (!
strstr(rtrim($str";"), ";") && substr_count($str";")) echo "TRUE";
После трех дней без программирования жизнь становится бессмысленной.

Оффлайн 017

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #3 : 31 Июля 2002, 14:04:47 »
и мой, и приведенный
(if (!strstr(rtrim($str, ";"), ";") && substr_count($str, ";")) echo "TRUE";)

пример работает когда строка задана явно : $str = "aaaaaaaaaaa;;;". Но вот следующая конструкция всегда выдает FALSE:

$textfile=fopen ("text.csv","r");
while (!feof($textfile)){
$str=fgets($textfile, 1024);
if (ereg ("(^[^\\;]+[\\;]*$)", $str)){
print "true";}
else {
print "false";}
}
fclose($textfile);

Текстовый файл text.csv:

Head1;
text1;text2
text3;text4
Head2;
text5;text6
text7;text8


В чем косяк? Все же работает, когда $str задан в коде!

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #4 : 31 Июля 2002, 14:09:52 »
Считай файл при помощи file()
и обработай получившийся массив.
AS IS...

Оффлайн 017

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #5 : 31 Июля 2002, 14:20:18 »
Благодарю за подсказку. По ходу это то что нужно.

Оффлайн GotZfild

  • Универсал
  • Старожил
  • ****
  • Сообщений: 456
  • +0/-0
  • 2
    • Просмотр профиля
    • http://myphp.dem.ru
Помогите с регулярным выражением
« Ответ #6 : 31 Июля 2002, 15:19:49 »
017
В твоем варианте, когда ты получаешь строку из файла, у нее на конце - \\n, в этом-то и
Цитировать
косяк
После трех дней без программирования жизнь становится бессмысленной.

Оффлайн 017

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #7 : 31 Июля 2002, 16:08:24 »
Хмм... Ну все правильно. Ведь мой рег так и различает конец строки. Пробовал вместо $ также ставить и \\n - результат тот-же.
Да! Кстати считать все с помощью File() и обработать как массив также не помогает.

$cntn=file(\'text.csv\');
while (list ($ln, $line) = each ($cntn))
{
if (ereg ("(^[^\\;]+[\\;]*$)", $line)){
echo "true";

Результат - false.

Я понимаю, что своим занудством уже всех достал, но "проблему" уже бросить не могу. Вроде мелкая хрень - но башка скоро может взорваться... Чего только уже не пробовал.

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
Помогите с регулярным выражением
« Ответ #8 : 31 Июля 2002, 16:27:25 »
сделай trim, а потом реги трави
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн 017

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #9 : 31 Июля 2002, 17:06:42 »
Всех благодарю. Представленный вариант в общем работает. Его задача - выделение из CSV-файла заголовков таблиц, потому как единственное отличие заголовка (в моем случае) от табличных данных - отсутствие \';\' в середине текста.
[PHP]
while (!feof($fp)){
$lnp=fgets($fp, 1024);
$ff=trim($lnp);
if (ereg ("(^[^\\;]+[\\;]*$)", $ff)){
print "true";
}
else {
print "false";
}

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #10 : 31 Июля 2002, 17:21:01 »
017
Ты просто путаешь знак перевода строки "\\n"
и признак конца строки, то есть всей переменной в регулярных выражениях $

а еще почитай про скорость на php.spb.ru
file работает ГОРАЗДО быстрее.

Так же, там написано, что простые строковые функции работают ГОРАЗДО быстрее ерегов.

Зачем тебе ерег, если надо всего лишь вырезать последний символ строки и  сравнить его с ; ???

Вот как будет выглядеть нормальный код:

$file
=file("file.txt");
$size=sizeof($file);
for(
$i=0;$i<$size;$i++) {
  if (
substr(trim($file[$i]), -1)==";") print "true";
  else print 
"false";
}

Оффлайн 017

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Помогите с регулярным выражением
« Ответ #11 : 01 Августа 2002, 09:57:48 »
Хитрость в том, что \';\' может быть и не одна. Критерием поиска служит отсутствие этого символа в середине строки.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28