Forum Webscript.Ru

Программирование => PHP => Тема начата: kosm от 04 Июня 2003, 15:20:12

Название: Как в регекспе указать НЕ?
Отправлено: kosm от 04 Июня 2003, 15:20:12
Т.е., как пример надо выделить все урлы, кроме того который называется NULL.
--







--
Составил регексп, который выбирает все
\\bHREF\\s*=\\s*([^=][\\w\\.\\:\\/]+[^>])

Конструкция [^символ] (НЕ какой-то символ) работает, но она ведь только для символов?
Подскажите плиз, как решить эту проблемму?

СПАСИБО!
Название: Как в регекспе указать НЕ?
Отправлено: Neter от 04 Июня 2003, 19:43:51
что-то типа [^(null)]
Название: Как в регекспе указать НЕ?
Отправлено: kosm от 05 Июня 2003, 10:45:18
Neter
Сразу попробовал такую конструкцию, но она не прокатила. Наверно потому, что [] - это символьный класс, и группировка тут не катит...
Название: Как в регекспе указать НЕ?
Отправлено: Neter от 05 Июня 2003, 17:45:32
Хмм.. действительно, тогда сначала надо грохнуть ненужные, а потом выбрать все остальные..
Название: Как в регекспе указать НЕ?
Отправлено: kosm от 05 Июня 2003, 19:04:16
Это как? Одним регекспом похоже не получится. Дело в том, что мне урл с NULL как раз грохать не надо, а надо оставить без изменения (а со всеми остальными работать).
Название: Как в регекспе указать НЕ?
Отправлено: nagash от 07 Июня 2003, 04:07:19
^(null)
зачем использовать []?
=)))
Название: Как в регекспе указать НЕ?
Отправлено: D1g174LM4n14c от 07 Июня 2003, 16:14:43
символ ^ вне [] НЕ означает отрицание!!
Название: Как в регекспе указать НЕ?
Отправлено: Neter от 07 Июня 2003, 16:27:26
kosm
Если надо исключить какой-то текст то для него надо писать отдельный регекс, а чтобы не трогать
достаточно просто указать что надо подсвечивать только те УРЛы значение в которых стоит в двойных кавычках, имхо это основное отличие от null..

"!
([\\w\\./\\?=&%\\+\\-\\~]+)!i" или что-то по типу того :)
Название: Как в регекспе указать НЕ?
Отправлено: FreeSpace от 07 Июня 2003, 16:45:26
А может сначала не исключать , а потом просто сделать нечто похожее на следующее:
$tmp = array();
foreach ($links as $link){
if ($link == "
")
continue;
$tmp[] = $link;
}
$links = $tmp;
unset($tmp);
Имхо, побыстрее ещё одного регекспа будет.
Название: Как в регекспе указать НЕ?
Отправлено: kosm от 09 Июня 2003, 10:42:40
Neter
К сожалению, у меня урлы могут быть и без ковычек (даже в основном) :( Так что они отличаются только наличием слова NULL ;(

FreeSpace
Да, похоже одним регексоп не обойтись... Придется на пару с пхпшкой. Единственное, что я не выдираю все урлы, а просто нахожу каждый и с ним работаю на месте...

Спасибо всем!

PS: Но вообще странно, что в таком богатом синтаксисе регекспов нет приема отрицания вхождения :/
Название: Как в регекспе указать НЕ?
Отправлено: Neter от 09 Июня 2003, 11:48:16
Да уж..
Название: Как в регекспе указать НЕ?
Отправлено: Neter от 09 Июня 2003, 12:43:48
Попробуй так :)

"!((?:http|https|ftp)://([a-z0-9_\\.]{2,30})){1}/?([a-z0-9_\\./\\?=&%\\+\\-\\~]{0,150})?!si"
Название: Как в регекспе указать НЕ?
Отправлено: FreeSpace от 09 Июня 2003, 19:10:04
Цитировать
динственное, что я не выдираю все урлы, а просто нахожу каждый и с ним работаю на месте...

Ну так никаких проблем нету, в любом случае можно на два действия разбить и особой потери производительности при этом не будет, насколько я знаю. Если что, выкладывай кусок кода тут - поможем! ;)
Название: Как в регекспе указать НЕ?
Отправлено: AlieN от 10 Июня 2003, 12:12:57
Цитировать
Neter:
Попробуй так

А если ссылки не полные ?
Название: Как в регекспе указать НЕ?
Отправлено: Neter от 10 Июня 2003, 13:14:17
Лови kosmатый :) Должно работать..

$string = preg_replace("!
([\\w_=&%\\+\\-\\~\\./]*)!si", "\\\\0",$string);
Название: Как в регекспе указать НЕ?
Отправлено: kosm от 10 Июня 2003, 16:30:02
Neter
Точно, нужно как можно точнее описать урл. Ведь мой NULL не совсем стандартный (в отличии от тех с которыми нужно работать).

Подправил немного твой регексп:
()

Теперь мой NULL просто под это выражение не подпадает...


Кстати, интересно, а если бы это на пару с php делать, то как бы это отразилось на скорость? Вообще регексы много кушают ресурсов?
Название: Как в регекспе указать НЕ?
Отправлено: kosm от 10 Июня 2003, 16:34:12
Вот как бы еще одну проблемку решить? Чего-то пока не соображу :(
http://forums.webscript.ru/showthread.php?s=&threadid=12205&msgnum=3

Может просто как?
(все выражение){3}
Название: Как в регекспе указать НЕ?
Отправлено: FreeSpace от 10 Июня 2003, 22:15:36
Люди, да чего вы в этих регекспах наворотили! Их же уже вообще читать невозможно! Хоть я их часто не использую, но знаю наверняка, что они очень медленные. Особенно с вложенными паттернами. ИМХО, куда быстрее будет разбить на две (может даже на три) части - сначала регекспом вытащить все ссылки в отдельный массив, потом проверить, есть ли в этом массиве ключ со значением "" или там substr_count($value, "null") > 0 и удалить соответствующий ключ. Ну а потом, если всё это надо вернуть назад в HTML-страничку, то при помощи strstr и ещё пары строковых функций это не составит особой проблемы.
[off]Я пишу это сообщение не потому, что приведенный мною способ никому не понравился, а скорее потому что хочу понять, почему он не понравился? Наверняка есть какие-то конструктивные замечания, которые я бы с удовольствием выслушал...[/off]
Название: Как в регекспе указать НЕ?
Отправлено: nagash от 11 Июня 2003, 02:09:14
мдя...
это же элементарно...
http://www.optim.ru/cs/2001/1/regular/regexpr.asp
читаем про Lookahead- и Lookbehind-условия
мдя...
Название: Как в регекспе указать НЕ?
Отправлено: kosm от 11 Июня 2003, 10:40:33
FreeSpace
Твой способ отличный. Но я просто не совсем понял каким образом потом расставить на свои места урлы :( То, что их можно вытянуть и потом что-то с ними делать, это мое самое первое предположение по решению этой задачи. Но к сожалению что с ними делать потом, я не придумал :( Если есть мысли по этому поводу - излагай, будет очень интересно.
А так, думаешь, в общем случае, оно будет бустрее работать (со вставкой из PHP)?
А на регекспы я еще кинулся потому, что хочется в них разобраться...

nagash
Спасибо, попробую с этим поиграться...
Название: Как в регекспе указать НЕ?
Отправлено: FreeSpace от 11 Июня 2003, 14:59:44
kosm
Скажем так, я не спец по регекспам и использую их редко. Тесты на скорость не проводил, но мне кажется, что мой способ работает быстрее, чем такие вот трёхэтажные регексповые паттерны. Во всяком случае читать точно легче :)
Почитай сначала инфу по ссылочке nagash\'а. Если это тебе не поможет, тогда уже будем дальше думать. Ну а если всё в один небольшой регексп уместишь - ну так вообще красота будет :)