Forum Webscript.Ru
Программирование => PHP => Тема начата: kosm от 04 Июня 2003, 15:20:12
-
Т.е., как пример надо выделить все урлы, кроме того который называется NULL.
--
--
Составил регексп, который выбирает все
\\bHREF\\s*=\\s*([^=][\\w\\.\\:\\/]+[^>])
Конструкция [^символ] (НЕ какой-то символ) работает, но она ведь только для символов?
Подскажите плиз, как решить эту проблемму?
СПАСИБО!
-
что-то типа [^(null)]
-
Neter
Сразу попробовал такую конструкцию, но она не прокатила. Наверно потому, что [] - это символьный класс, и группировка тут не катит...
-
Хмм.. действительно, тогда сначала надо грохнуть ненужные, а потом выбрать все остальные..
-
Это как? Одним регекспом похоже не получится. Дело в том, что мне урл с NULL как раз грохать не надо, а надо оставить без изменения (а со всеми остальными работать).
-
^(null)
зачем использовать []?
=)))
-
символ ^ вне [] НЕ означает отрицание!!
-
kosm
Если надо исключить какой-то текст то для него надо писать отдельный регекс, а чтобы не трогать достаточно просто указать что надо подсвечивать только те УРЛы значение в которых стоит в двойных кавычках, имхо это основное отличие от null..
"!([\\w\\./\\?=&%\\+\\-\\~]+)!i" или что-то по типу того :)
-
А может сначала не исключать , а потом просто сделать нечто похожее на следующее:
$tmp = array();
foreach ($links as $link){
if ($link == "")
continue;
$tmp[] = $link;
}
$links = $tmp;
unset($tmp);
Имхо, побыстрее ещё одного регекспа будет.
-
Neter
К сожалению, у меня урлы могут быть и без ковычек (даже в основном) :( Так что они отличаются только наличием слова NULL ;(
FreeSpace
Да, похоже одним регексоп не обойтись... Придется на пару с пхпшкой. Единственное, что я не выдираю все урлы, а просто нахожу каждый и с ним работаю на месте...
Спасибо всем!
PS: Но вообще странно, что в таком богатом синтаксисе регекспов нет приема отрицания вхождения :/
-
Да уж..
-
Попробуй так :)
"!((?:http|https|ftp)://([a-z0-9_\\.]{2,30})){1}/?([a-z0-9_\\./\\?=&%\\+\\-\\~]{0,150})?!si"
-
динственное, что я не выдираю все урлы, а просто нахожу каждый и с ним работаю на месте...
Ну так никаких проблем нету, в любом случае можно на два действия разбить и особой потери производительности при этом не будет, насколько я знаю. Если что, выкладывай кусок кода тут - поможем! ;)
-
Neter:
Попробуй так
А если ссылки не полные ?
-
Лови kosmатый :) Должно работать..
$string = preg_replace("!([\\w_=&%\\+\\-\\~\\./]*)!si", "\\\\0",$string);
-
Neter
Точно, нужно как можно точнее описать урл. Ведь мой NULL не совсем стандартный (в отличии от тех с которыми нужно работать).
Подправил немного твой регексп:
()
Теперь мой NULL просто под это выражение не подпадает...
Кстати, интересно, а если бы это на пару с php делать, то как бы это отразилось на скорость? Вообще регексы много кушают ресурсов?
-
Вот как бы еще одну проблемку решить? Чего-то пока не соображу :(
http://forums.webscript.ru/showthread.php?s=&threadid=12205&msgnum=3
Может просто как?
(все выражение){3}
-
Люди, да чего вы в этих регекспах наворотили! Их же уже вообще читать невозможно! Хоть я их часто не использую, но знаю наверняка, что они очень медленные. Особенно с вложенными паттернами. ИМХО, куда быстрее будет разбить на две (может даже на три) части - сначала регекспом вытащить все ссылки в отдельный массив, потом проверить, есть ли в этом массиве ключ со значением "" или там substr_count($value, "null") > 0 и удалить соответствующий ключ. Ну а потом, если всё это надо вернуть назад в HTML-страничку, то при помощи strstr и ещё пары строковых функций это не составит особой проблемы.
[off]Я пишу это сообщение не потому, что приведенный мною способ никому не понравился, а скорее потому что хочу понять, почему он не понравился? Наверняка есть какие-то конструктивные замечания, которые я бы с удовольствием выслушал...[/off]
-
мдя...
это же элементарно...
http://www.optim.ru/cs/2001/1/regular/regexpr.asp
читаем про Lookahead- и Lookbehind-условия
мдя...
-
FreeSpace
Твой способ отличный. Но я просто не совсем понял каким образом потом расставить на свои места урлы :( То, что их можно вытянуть и потом что-то с ними делать, это мое самое первое предположение по решению этой задачи. Но к сожалению что с ними делать потом, я не придумал :( Если есть мысли по этому поводу - излагай, будет очень интересно.
А так, думаешь, в общем случае, оно будет бустрее работать (со вставкой из PHP)?
А на регекспы я еще кинулся потому, что хочется в них разобраться...
nagash
Спасибо, попробую с этим поиграться...
-
kosm
Скажем так, я не спец по регекспам и использую их редко. Тесты на скорость не проводил, но мне кажется, что мой способ работает быстрее, чем такие вот трёхэтажные регексповые паттерны. Во всяком случае читать точно легче :)
Почитай сначала инфу по ссылочке nagash\'а. Если это тебе не поможет, тогда уже будем дальше думать. Ну а если всё в один небольшой регексп уместишь - ну так вообще красота будет :)