Регулярное выражение игнорировать, а не исключать

Я совершенно потерян. Мне нужно регулярное выражение, которое может обнаружить любой из 4 начальных URL-адресов, как показано ниже.

 ^(.*http://.*|.*http%3A%2F%2F.*|.*https://.*|.*https%3A%2F%2F.*)$

И ... .

должен обнаруживать: (любой знак препинания, пробел или возврат) (3 раза букву w в верхнем или нижнем регистре) (одну точку) (что угодно)

И ... . что важно

Следует игнорировать, но НЕ исключать... . следующая точная строка (независимо от того, присутствует ли она на странице или нет)

 http://www.w3.org

Что сложно для меня, потому что мне все равно нужно включить его в строку регулярного выражения, даже если оно игнорируется, иначе оно будет совпадать и будет найдено в

    (.*http://.*|.*http%3A%2F%2F.*|.*https://.*|.*https%3A%2F%2F.*)

И моя цель - найти/сопоставить любой URL-адрес, кроме

    http://www.w3.org 

даже если он есть на странице, или если его нет. поэтому, если на странице есть только это:

    http://www.w3.org

и никакой другой URL.. тогда он не должен совпадать.


Спасибо, Тайлер, но мои знания регулярных выражений почти нулевые, я могу знать только, что делают команды, когда я щелкаю по ним правой кнопкой мыши, чтобы выбрать действия, такие как в regulazy или regexr ((

Итак, я обновил свою команду в соответствии с предоставленным вам URL-адресом: href%3D%22http%3A%2F%2Fwww%2Edommermuth%2D1%2Ecom, и это работает:

https?(://|%3A%2F%2F)(?!www.w3.org)(.*)

Но из-за недостатка знаний я не понимаю, как это сделать ниже

«То, что вы можете сделать, это сделать часть http необязательной или должна соответствовать http или www или обоим. Этот тип регулярного выражения возник в другом вопросе, на который я недавно ответил — Несколько preg_replace RegEx для разных URL-адресов»

Я пытался добавить это, но это не работает: (www.)

Все, что мне сейчас не хватает, это обнаружение URL-адресов, начинающихся с www

(любой знак препинания, пробел или возврат) (3 раза больше буквы w в верхнем или нижнем регистре) (одна точка) (все, что угодно, пока не достигнет пробела или конца строки)


person user3451630    schedule 23.03.2014    source источник
comment
Не ссылайтесь на сообщения на другом сайте (срок их действия истекает). Научитесь просто правильно форматировать свои вопросы (URL-адреса в коде не считаются ссылками).   -  person Doc Brown    schedule 23.03.2014
comment
Вам нужно, чтобы все было в 1 регулярном выражении? Почему бы не объединить 2 регулярных выражения, первое для сопоставления и второе для исключения? Какой язык кодирования вы используете?   -  person ilomambo    schedule 23.03.2014
comment
Я не понимаю вашего различия между игнорированием и исключением. Вы хотите написать регулярное выражение, которое соответствует определенному формату URL-адресов, но не соответствует формату w3. Для меня это все еще исключение.   -  person Eric    schedule 23.03.2014
comment
.Net регулярное выражение верно? Если это так, добавьте его в теги вопроса.   -  person ΩmegaMan    schedule 25.03.2014
comment
Или вы могли бы в конечном итоге попытаться исправить это, если это возможно, я изменил свою команду: regexr.com/v1?38kmv   -  person user3451630    schedule 29.03.2014
comment
@user3451630 user3451630 Можете ли вы привести нам фактические примеры необработанного текста с тем, что нужно сопоставить в этом тексте, а что следует исключить?   -  person ΩmegaMan    schedule 29.03.2014
comment
Омегамен, я дал вам примеры в URL-адресе регулярного выражения выше, пожалуйста, прочитайте его.   -  person user3451630    schedule 29.03.2014


Ответы (1)


ОК, попробуйте это:

/\bhttps?(://|%3A%2F%2F)(?!www\.w3\.org)(.*)\b/g

Проверьте здесь: http://regexr.com?38jp5

Эта тестовая ссылка использует регулярное выражение в стиле javascript, но должна работать в другом месте.

Важная часть — это вторая половина — отрицательный просмотр вперед, который проверяет, что следующее не является точным текстом www.w3.org

Я сжал то, что было у вас: мой соответствует http, затем необязательному s, затем либо ://, либо %3A%2F%2F.

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


Что касается вопросов ОП:

D%22 может появиться перед http или https

этот отсутствует и должен соответствовать: href%3D%22http%3A%2F%2Fwww%2Edommermuth%2D1%2Ecom

Если это имеет значение, просто удалите границу слова \b до и после регулярного выражения, чтобы http мог совпадать где угодно.

Команда регулярного выражения должна обнаруживать: (любой знак препинания, пробел или возврат) (3 раза больше буквы w в верхнем или нижнем регистре) (одна точка) (что угодно)

Это регулярное выражение не сможет сопоставить ссылку типа http://google.com — поиск www — не лучший способ. проверить ссылку самостоятельно. Что вы можете сделать, так это сделать часть http необязательной или должна соответствовать http или www или обоим. Этот тип регулярного выражения возник в другом вопросе, на который я недавно ответил: preg_replace RegEx для разных URL


Редактировать № 2:

(любой знак препинания, пробел или возврат) (3 раза больше буквы w в верхнем или нижнем регистре) (одна точка) (все, что угодно, пока не достигнет пробела или конца строки)

Как я упоминал выше, то, что вы описываете, не будет соответствовать URL-адресу типа http://google.com, но если это это то, что вы хотите, используйте это:

(\W|^)[wW]{3}\.[^\s$]+

Вместо этого, я думаю, вам нужно вот это, представляющее собой комбинацию моего первого ответа и ссылки на другой пост выше.

((https?(://|%3A%2F%2F))(www\.)|(https?(://|%3A%2F%2F))|(www\.))(?!(www\.)?w3\.org)([^</\?\s]+)[^<\s]*

Вы захотите использовать это регулярное выражение с глобальными и нечувствительными флагами.

person dtyler    schedule 23.03.2014
comment
Обратите внимание, что это немного более расслаблено, чем OP, и будет соответствовать https%3A/%2F.... Чтобы быть эквивалентным, вы хотели бы https?(://|%3A%2F%2F) - person Eric; 23.03.2014
comment
Для полноты избегайте . - в противном случае это также игнорирует wwwxw3.org. Непонятно, для чего это используется, но именно из-за такого упущения появляются незаметные ошибки и уязвимости в системе безопасности. - person gregmac; 24.03.2014
comment
Спасибо, что поймали это @gregmac - обновили регулярное выражение и ссылку - person dtyler; 24.03.2014
comment
@ user3451630 wye.cg/ye3 не должно совпадать не, потому что оно не соответствует ни одному из правил, которые вы мне дали. Он не начинается с http или www, которые вы используете для поиска ссылки. Я не знаю, какие правила вы сейчас пытаетесь использовать. - person dtyler; 26.03.2014
comment
Вот моя последняя команда с одной ошибкой, описанной здесь: regexr.com/v1?38kmp - person user3451630; 29.03.2014
comment
@user3451630 user3451630 Я думаю, вы пытаетесь сделать что-то, для чего Regex не предназначен. Regex требуется очень строгий шаблон для сопоставления, который подходит для сопоставления http или www. Но регулярное выражение не может решить, является ли URL-адрес действительным или нет без строгого правила. Например, вы хотите сопоставить ww2.deee.eee, но не www2.dzede.eeex — оба эти URL-адреса теоретически допустимы. Вы столкнетесь со многими странными случаями, когда вы пропустите URL-адрес или получите ложное срабатывание с этими случайными пограничными случаями, которые вы пытаетесь сопоставить. - person dtyler; 29.03.2014
comment
Да, со строгим правилом, как точный текст w3.org не должен появляться, регулярное выражение будет работать. Но какое именно правило вы хотите здесь использовать? Что именно в wye.cg/ye3 вы хотите сопоставить? - person dtyler; 30.03.2014
comment
Это именно то, что я сказал выше: вы столкнетесь со многими странными случаями, когда вы пропустите URL-адрес .... Почему lodezeldeed.com должен совпадать? Этого не должно быть, это не соответствует правилам, которые вы мне дали. - person dtyler; 30.03.2014
comment
/i — это флаг, который должен стоять в конце вашего регулярного выражения. regexr.com/v1?38ko3. - person dtyler; 30.03.2014
comment
Трудно сказать, что вы пробовали, а что не работает, и, похоже, это не связано с исходным вопросом. Я бы предложил задать новый вопрос, включая минимальные примеры для воспроизведения вашей новой проблемы и то, что вы пробовали сами, чтобы остальная часть сообщества SO также могла помочь. - person dtyler; 03.05.2014
comment
Я действительно смущен тем, что вы хотите. Regex - это механизм сопоставления, похоже, то, что вы пытаетесь сделать, будет лучше работать из кода. Я все еще думаю, что заслуживает нового вопроса. Не копируйте объяснение, вы должны просто ограничить вопрос этой новой проблемой. Укажите соответствующий код, который вы используете, что он должен делать, а что нет. - person dtyler; 04.05.2014