Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Регулярное выражение (http://forum.oszone.net/showthread.php?t=52754)

benya 16-08-2005 14:13 348470

Регулярное выражение
 
Господа, как написать регулярное выражение которое вырезает первых 2 символа или один в зависимости от длины строки. Нужно проверить только 2 условия на 6 и 5 цифр.
Например, имеем число: 25000
Если число имеет 6 цифр, оставляем только первых 2, тоесть 25
Если же число имеет 5 цифр, оставляем только одно. Тоесть 2
Можно ли задать такое регулярным выражением??
Не хотелось бы писать всякие if-then-else....

vadimiron 16-08-2005 15:50 348491

а что надо?? Может просто делить на 1000 и всё??

mar 16-08-2005 15:51 348493

Цитата:

Не хотелось бы писать всякие if-then-else....
это шутка, или непонимание, что такое разветвление и условие в программировании? Если экономия места, то пишите
PHP код:

strlen($a) == вариант раз вариант два


XCodeR 16-08-2005 23:11 348576

benya
может быть если напишете, что конкретно надо, будет понятнее?

mar
чтоб тему новую не создавать, можете написать синтаксис сокращенного ветления( = ? : ).

mar 16-08-2005 23:48 348582

Xcode
Код:

условие? вариант, работающий при выполнении условия : вариант, идущий в случае невыполнения;
Это как-то уже всплывало в теме Пользовательский ввод - не позволить рвать страничку., и тоже, как побочный результат жизнедеятельности.
Но в нашем-то случае, имхо все - побочное, а решение, как уже сказал vadimiron - надо просто все делить на энное количество тысяч и отбрасывть дробную часть.

E-mail 17-08-2005 01:18 348587

([0-9][0-9])[0-9][0-9][0-9][0-9]

([0-9])[0-9][0-9][0-9][0-9]

такое?:)

eleo 17-08-2005 15:08 348681

если я правильно поняла отбрасываются последние 4 цифры:
/(\d{1,2})\d{4}$/

XCodeR 17-08-2005 21:47 348779

E-mail,eleo
зачем уводить человека в лес?...
vadimiron и mar имхо дали более корректный совет.
"strlen + if + деление" работают быстрее, чем функции регулярных выражений.
имхо...

benya 17-08-2005 22:16 348787

Мне на самом деле нужно было вычислить количество лет от определенной даты.
Правильно подкинул идею vadimiron.
Там вообще не нужны никакие регулярные выражения.
Я сделал так :
$vozrast = "19791012"; день рождения
$dr = "20050818"; # текущая дата
$vozrast = int(($dr-$vozrast)/10000);
Получаем правильное число даже если человеку будет 200 лет ;)))

vadimiron 18-08-2005 00:09 348812

Цитата:

Правильно ответил vadimiron, только я делю на 10000. И отбрасывал остачу. Все работает. Спасибо
В комплекте с ПХП ещё есть интересная функция bcdiv, в ней можно делить два числа и указывать, сколько знаков после запятой нужно считать

benya 18-08-2005 11:07 348879

Мда, только вот пишу я не на php, а на Perl, а там такой функции видимо нет ;))

slaine 18-08-2005 13:25 348924

F как мне игнорировать больше одного тега <BR>?
Если нужно, чтобы пустые строки нешли подряд больше одного раза.
типа вот так:
asd





ads

Prisoner 18-08-2005 16:39 348981

Можно так:
PHP код:

$result preg_replace('/(?:\s*<br>\s*){2,}/i''<br>'$subject); 

С учетом, что в последовательности <br> могут быть пробельные символы и регистронезависимости.

slaine 18-08-2005 16:57 348988

Круто..
Надо мне всё-таки подучить регулярные выражения.

vadimiron 18-08-2005 17:30 348997

Цитата:

Можно так:

PHP код:
$result = preg_replace('/(?:\s*<br>\s*){2,}/i', '<br>', $subject);
slaine
Здесь тоже не обязательно пользоваться регулярками. Когда точно известен набор букв, которые мы хотим заменить. то лучше пользоваться стринг-функциями ПХП, БЫСТРЕЙ будет.
Например:mixed str_replace ( mixed search, mixed replace, mixed subject )

Регулярки нужны, когда мы не знаем, как выглядит строка, например имеется информация только о том, что в строке сначало идут 3 цифры, а потом бесконечное число букв и пробелов, в этом случае без регулярных выражений не обойтись.

К модерам: может сделаем прикреплённую тему по регуляркам, у меня будет время в середине августа, я смогу небольшой мануал накатать???

slaine 18-08-2005 18:28 349012

Цитата:

Здесь тоже не обязательно пользоваться регулярками. Когда точно известен набор букв, которые мы хотим заменить. то лучше пользоваться стринг-функциями ПХП, БЫСТРЕЙ будет.
Например:mixed str_replace ( mixed search, mixed replace, mixed subject )
vadimiron
И как в моём случае это будет выглядеть?

Prisoner 18-08-2005 18:45 349021

vadimiron
Я тоже помню эту цитату по производительности из мануала ;). На вскидку фигура "str_replace" в мозговом тетрисе никуда не вляпалась... И все только из-за всяких возможных гадостей между br'ками

vadimiron 19-08-2005 13:02 349239

slaine, Prisoner
Правильно, моя ошибка, так как мы вырезаем только те <br>, которые друг за другом идут. А если между ними есть текст, то не вырезаем-это как раз случай для регулярных выражений :)

Jekamajor 22-08-2005 18:00 349856

при помощи какого js регулярного выражения в тексте можно найти всё, кроме определенной последовательности символов?

Допустим var regExp=/word/g; найдет только слово "word", а как можно найти все остальное, кроме слова "word"?
Например var regExp=/[^word]/g; найдет все символы в тексте, кроме символов 'w' 'o' 'r' 'd', а можно ли каким-либо образом указать, чтобы "word" в квадратных скобках интерпретировалась не как любая последовательность символов 'w' 'o' 'r' 'd', а как строгая последовательность 'word'? Спасибо

Prisoner 22-08-2005 18:35 349859

Имхо, тут как раз не стоит применять регулярки. Бить по словам и циклом, циклом! :)

Jekamajor 22-08-2005 20:36 349889

я знаю, но тут мне эта инфа нужна не для конкретной цели, а так, для общего развития ;) Если знаете, подскажите плиз

Prisoner 23-08-2005 10:59 350025

В том-то и дело, что не ведаю :(. Проблема в работе класса - посимвольно он работает, не со словами.

Jekamajor 23-08-2005 12:06 350047

если б в [^abcd] можно было б указать, что это не беспорядочная последовательность символов, а конкретная, проблем бы не было.
или в простом /abcd/ поставить отрицание, но как? :(

Jekamajor 24-08-2005 00:55 350229

ладно, легче ориентироваться на конкретных примерах: пусть надо удалить из текста все теги. Регулярное выражение будет такое:
/<[^>]*>/gi;
А вот как справиться с такой задачей, если надо удалить все теги, кроме ссылок? т.е. кроме тегов <a href> и </a>?
Можно исключить букву 'a' в квадратных скобках: /<[^a>]*>/gi; но тогда не будут удаляться все теги, где встретится буква 'a', например <font color=blAck> не удалится, а надо, чтоб удалился.
Может создать выражение, которое не будет трогать только теги, начинающиеся с '<a ' и '</a ', а остальные все удалять? Но как такое сделать, я не знаю. Не хватает в голове чего-то. Не поможете мне справиться с такой задачей? Спасибо!

ivank 25-08-2005 18:08 350811

Как вариант - предварительно выбирать все теги. А потом уже отдельным регэкспом проверять дозволенный это тег или нет. Если пишется на перле, то надо обратить внимание на модификтор 'e' для регэкспов.

Выглядеть это будет примернол так:
Код:

$text = q~
<p align="left"><a href="link">Link?</a></p>
~;

$text =~ s/(<.*?>)/change_tag($1)/eg;
print $text;

sub change_tag
{
    $tag = $_ = shift;
    # открывающий a - можно
    return $tag if (/<\s*(a|a\s+.*?)>/i);
    # закрывающий a - можно
    return $tag if (/<\s*\/\s*a\s*>/i);
    # всё остальное - нельзя
    return "";
}

Этот код подразумевает, что внутри тега не встречается символа >, как и должно быть в правильном (x)html. Но на практике часто это требование не удовлетворяется (например <a href="javascript:if(a<b)call_comething_strange();">). В принципе регэкспы можно модифицировать и под подобные случаи, но тогда они будут уж слишком монстрообразны; мне лень.

Самый правильный метод, применим в случае если имеется валидный xhtml, тогда можно произвести довольно банально xslt преобразование. Вот.

Jekamajor 26-08-2005 11:53 351009

ой, блин, а это на перле? А как бы его переделать в javascript? Если это работает, то подойдет для большинства случаев, а <a href="javascript:if(a<b)call_comething_strange();"> не думаю, что такое будет часто встречаться :)
Спасибо!

ivank 26-08-2005 14:02 351046

гм... на jsavascript так не получится, его регэкспы понимают только модификаторы g, m и i...

Jekamajor 26-08-2005 14:34 351055

да, жалько, очень жалко


Время: 01:15.

Время: 01:15.
© OSzone.net 2001-