Forum Webscript.Ru

Программирование => PHP => Тема начата: 017 от 31 Июля 2002, 12:18:11

Название: Помогите с регулярным выражением
Отправлено: 017 от 31 Июля 2002, 12:18:11
Мужики! Очень нужно вычислить, встречается ли символ \';\' в конце строки (1 и более раз). Но условие не должно выполняться, если \';\' встречается в середине (т.е. ааа_ббб;; - true, а например ааа;ббб;;; - уже false потому как \';\' присутствует в середине строки). Для нахождения этого условия использую следующую конструкцию:

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

Результат выполнения всегда false.  Обращаюсь ко всем за помощью!
Название: Помогите с регулярным выражением
Отправлено: Alexandr от 31 Июля 2002, 13:05:20
Сам в регах мало понимаю обычно подправляю чужие.
Вот ссылка:
http://php.spb.ru/php/regexp.html

И чаще пользуйся preg.
Вот ещё ссылка:
http://php.spb.ru/php/speed.html
Название: Помогите с регулярным выражением
Отправлено: GotZfild от 31 Июля 2002, 13:24:42
Тут регулярки даже не нужны

$str = ";aaabbb;;;";
if (!strstr(rtrim($str, ";"), ";") && substr_count($str, ";")) echo "TRUE";
Название: Помогите с регулярным выражением
Отправлено: 017 от 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 от 31 Июля 2002, 14:09:52
Считай файл при помощи file()
и обработай получившийся массив.
Название: Помогите с регулярным выражением
Отправлено: 017 от 31 Июля 2002, 14:20:18
Благодарю за подсказку. По ходу это то что нужно.
Название: Помогите с регулярным выражением
Отправлено: GotZfild от 31 Июля 2002, 15:19:49
017
В твоем варианте, когда ты получаешь строку из файла, у нее на конце - \\n, в этом-то и
Цитировать
косяк
Название: Помогите с регулярным выражением
Отправлено: 017 от 31 Июля 2002, 16:08:24
Хмм... Ну все правильно. Ведь мой рег так и различает конец строки. Пробовал вместо $ также ставить и \\n - результат тот-же.
Да! Кстати считать все с помощью File() и обработать как массив также не помогает.

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

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

Я понимаю, что своим занудством уже всех достал, но "проблему" уже бросить не могу. Вроде мелкая хрень - но башка скоро может взорваться... Чего только уже не пробовал.
Название: Помогите с регулярным выражением
Отправлено: Alexandr от 31 Июля 2002, 16:27:25
сделай trim, а потом реги трави
Название: Помогите с регулярным выражением
Отправлено: 017 от 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";
}
Название: Помогите с регулярным выражением
Отправлено: Меняздесьдавнонет от 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 от 01 Августа 2002, 09:57:48
Хитрость в том, что \';\' может быть и не одна. Критерием поиска служит отсутствие этого символа в середине строки.