Регулярное выражение PHP для соответствия любому URL-адресу, кроме URL-адресов с Example.com

Приведите пример для псевдо-регулярного выражения: сопоставьте все URL-адреса, кроме URL-адресов с example.com и example2.com, в соответствии с синтаксисом регулярного выражения PHP.

Вот что у меня есть, но это не работает:

$patternToMatch = "@https?://[^(example.com|example2.com)]\"*@i";

person darkAsPitch    schedule 01.03.2010    source источник
comment
Это домашнее задание? Если да, отметьте это как таковое.   -  person Pekka    schedule 01.03.2010
comment
Хаха, нет. Это не домашнее задание. Я новичок в регулярном выражении. Но спасибо за оскорбление! Как насчет ответа?   -  person darkAsPitch    schedule 01.03.2010
comment
Не оскорбление; просто контроль качества. Часто вопросы, сформулированные таким образом, звучат так: посмотрите, как первый абзац выглядит как требования задания. Это все :)   -  person Matchu    schedule 02.03.2010
comment
Да, я думаю, я понимаю, как это может выглядеть ... Я просто подумал, что вместо того, чтобы писать, я пытаюсь ... или я хочу это сделать ... Я бы написал немного более профессионально.   -  person darkAsPitch    schedule 02.03.2010
comment
Да, опубликованный вопрос выглядит так, как будто он был скопирован из домашнего задания. Это не делает его профессиональным, это делает вид, что это не вопрос.   -  person Juan Mendes    schedule 17.12.2010


Ответы (4)


Проблема здесь в том, что в определении класса ([]) специальные символы, такие как ( и |, теряют свое значение.

Лучшее решение - сопоставить на example.com или example2.com, а затем переходить только к отрицательным тестам.

person Segfault    schedule 01.03.2010
comment
Спасибо, Segfault, похоже, мне нужно удалить все URL-адреса example.com, а затем искать оставшиеся URL-адреса, верно? Еще раз спасибо! - person darkAsPitch; 01.03.2010

Не используйте регулярные выражения для ненужных вещей.

$parts = parse_url($url);
if ($parts && $parts['host'] != 'example.com' && $parts['host'] != 'example2.com') {
    // the URL seems OK
}
person Lukáš Lalinský    schedule 01.03.2010
comment
Лукас, я пытаюсь извлечь URL-адреса из текстового документа. У меня нет адресов под рукой. Мне нужно регулярное выражение. - person darkAsPitch; 01.03.2010

Нет, все, что находится в квадратных скобках, соответствует только одному символу. Например, регулярное выражение:

[^example]

будет соответствовать любому одиночному символу, кроме e, x, a, m, p, l и e.

Попробуйте выполнить отрицательный просмотр вперед:

@https?://(www\.)?(?!example2?.com)@i
person Bart Kiers    schedule 01.03.2010

Вы почти получили ответ. Это будет соответствовать вашему желанию.

$patternToMatch = "@https?://(example.com|example2.com)@i";
person aberpaul    schedule 01.03.2010
comment
Спасибо, aberpaul, но похоже, что он найдет ТОЛЬКО example.com и example2.com - мне нужно все, НО example.com и example2.com - person darkAsPitch; 02.03.2010
comment
Я предполагаю (возможно, ошибочно) вы сможете использовать PHP? чтобы проверить, вернул ли совпадение истину / ложь. Я могу видеть мысли segfault в этом направлении. - person aberpaul; 03.03.2010