Forum Webscript.Ru
Программирование => PHP => Тема начата: 017 от 31 Июля 2002, 12:18:11
-
Мужики! Очень нужно вычислить, встречается ли символ \';\' в конце строки (1 и более раз). Но условие не должно выполняться, если \';\' встречается в середине (т.е. ааа_ббб;; - true, а например ааа;ббб;;; - уже false потому как \';\' присутствует в середине строки). Для нахождения этого условия использую следующую конструкцию:
ereg ("([^\\;]+;+$)")
Результат выполнения всегда false. Обращаюсь ко всем за помощью!
-
Сам в регах мало понимаю обычно подправляю чужие.
Вот ссылка:
http://php.spb.ru/php/regexp.html
И чаще пользуйся preg.
Вот ещё ссылка:
http://php.spb.ru/php/speed.html
-
Тут регулярки даже не нужны
$str = ";aaabbb;;;";
if (!strstr(rtrim($str, ";"), ";") && substr_count($str, ";")) echo "TRUE";
-
и мой, и приведенный
(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 задан в коде!
-
Считай файл при помощи file()
и обработай получившийся массив.
-
Благодарю за подсказку. По ходу это то что нужно.
-
017
В твоем варианте, когда ты получаешь строку из файла, у нее на конце - \\n, в этом-то и косяк
-
Хмм... Ну все правильно. Ведь мой рег так и различает конец строки. Пробовал вместо $ также ставить и \\n - результат тот-же.
Да! Кстати считать все с помощью File() и обработать как массив также не помогает.
$cntn=file(\'text.csv\');
while (list ($ln, $line) = each ($cntn))
{
if (ereg ("(^[^\\;]+[\\;]*$)", $line)){
echo "true";
Результат - false.
Я понимаю, что своим занудством уже всех достал, но "проблему" уже бросить не могу. Вроде мелкая хрень - но башка скоро может взорваться... Чего только уже не пробовал.
-
сделай trim, а потом реги трави
-
Всех благодарю. Представленный вариант в общем работает. Его задача - выделение из CSV-файла заголовков таблиц, потому как единственное отличие заголовка (в моем случае) от табличных данных - отсутствие \';\' в середине текста.
[PHP]
while (!feof($fp)){
$lnp=fgets($fp, 1024);
$ff=trim($lnp);
if (ereg ("(^[^\\;]+[\\;]*$)", $ff)){
print "true";
}
else {
print "false";
}
-
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";
}
-
Хитрость в том, что \';\' может быть и не одна. Критерием поиска служит отсутствие этого символа в середине строки.