Повторяющийся шаблон внутри URL

Может ли кто-нибудь помочь нам с регулярным выражением для обнаружения повторяющихся шаблонов внутри строки URL? Цель, очевидно, состоит в том, чтобы обнаружить неверно сформированные странные URL-адреса.

Например, допустимы следующие URL:

http://www.somewhere.com/help/content/21/23/en/
http://www.somewhere.com/help/content/21/24/en/
http://www.somewhere.com/help/content/21/64/en/
http://www.somewhere.com/help/content/21/65/en/
http://www.somewhere.com/help/content/21/67/en/

В то время как эти неверны и должны быть помечены:

http://www.somewhere.com/help/content/21/content/1/54/en/
http://www.somewhere.com/help/content/21/content/1/62/en/
http://www.somewhere.com/help/content/21/content/8/52/en/

Поскольку content повторяется дважды. До сих пор мы решали эту проблему с помощью parse_url и Explosion, но это выглядит довольно неэффективно!

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

Большое спасибо!

Чтобы лучше понять проблему, вы можете перейти по следующей ссылке и нажать «Администратор MySQL»:

http://www.elserver.com/ayuda/content/21/65/es/


person Chris Russo    schedule 24.09.2012    source источник
comment
В ваших примерах нет повторяющегося шаблона - только содержание слова. Если это все, о чем вы беспокоитесь, вы можете использовать substr_count, а если контент появляется более одного раза, отметьте его. В противном случае, пожалуйста, опубликуйте примеры возможных шаблонов, которые могут повторяться.   -  person newfurniturey    schedule 24.09.2012
comment
Не похоже, что это устаревшие URL-адреса, которые вам нужно переназначить на новую систему - похоже, они неправильно генерируются в системе. Поэтому я бы нашел и исправил настоящую проблему, а не перевязывал ее, анализируя и затем исправляя уже неправильные URL-адреса.   -  person prodigitalson    schedule 24.09.2012
comment
newfurniturey, Вы правы, однако я, конечно, не знаю, что еще может придумать, так как это часть краулера, поток информации на самом деле огромен, и есть много веб-сайтов с ошибками разработки, которые могут зациклить систему до бесконечности.   -  person Chris Russo    schedule 24.09.2012
comment
prodigitalson, я думал так же, пока не понял, что то же самое происходит и при просмотре веб-сайтов с помощью Chrome и Firefox. Это ошибка в некоторых реализациях вики.   -  person Chris Russo    schedule 24.09.2012
comment
Вы даже не можете пытаться отлаживать чужие сайты. Некоторые веб-сайты имеют правомерно повторяющиеся шаблоны в своих URL-адресах. Некоторые могут иметь лишнее семантическое повторение, но оно все равно необходимо для того, чтобы сайт работал. Если вы создаете сканер, вы наказываете людей за предоставление неверных URL-адресов, вы не пытаетесь решить их проблемы, тем более что диапазон возможных проблем, когда вы смотрите на черный ящик, бесконечен.   -  person DaveRandom    schedule 24.09.2012
comment
Отлаживать другие веб-сайты? Судя по качеству вопроса, я бы предположил, что у ОП есть сканер с недостатками. И поэтому этот вопрос - в том виде, в котором он написан, - слишком локализован. Мы не будем отлаживать ваш поисковый робот, если вы не попросите об этом.   -  person hakre    schedule 24.09.2012
comment
DaveRandom и Hakra, спасибо за ответы, я предполагаю, что задал неправильный вопрос. Я только что обновил вопрос ссылкой, чтобы вы могли видеть, что нам нужно предотвратить. И, к сожалению, это не один сайт.   -  person Chris Russo    schedule 24.09.2012


Ответы (2)


Предполагая, что у вас есть файл (testdata.txt), который содержит список URL-адресов, по одному в строке, следующий протестированный скрипт извлечет те URL-адреса, которые имеют (по крайней мере) один повторяющийся сегмент пути:

<?php // test.php Rev:20120924_0800
$re = '%
    ^                  # Anchor to start of line.
    (?:[^:/?#\s]+:)?   # URI scheme (optional).
    (?://[^/?#\s]*)?   # URI Authority (optional).
    (?:/[^/?#\s]*)*?   # URI path segments (before repeats).
    /([^/?#\s]+)       # $1: Repeated URI path segment.
    (?:/[^/?#\s]*)*?   # URI path segments (between repeats)
    /\1                # $1: Repeated URI path segment.
    (?:/[^/?#\s]*)*    # URI path segments (after repeats).
    (?:\?[^#\s]*)?     # URI query (optional).
    (?:\#\S*)?         # URI fragment (optional).
    $                  # Anchor to end of line.
    %mx';
$text = file_get_contents('testdata.txt');
if (preg_match_all($re, $text, $matches)) print_r($matches[0]);
else echo("no matches!");
?>
person ridgerunner    schedule 24.09.2012
comment
Здорово!! Большое спасибо ridgerunner! - person Chris Russo; 24.09.2012

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

  • URI не имеют искаженного формата. Они синтаксически правильны и поэтому правильно сформированы.
  • Чтобы решить вашу проблему, не создавайте эти URI в первую очередь.
  • Если вы создаете парсер, вам необходимо придерживаться стандартов, включая обработку того, как преобразовать относительный URI в базовый URI документов: http://tools.ietf.org/html/rfc3986#section-4.2

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


Пример набора данных показывает, что есть проблема с данными:

Base URI: http://www.elserver.com/ayuda/content/21/65/es/
HREF    : content/1/62/es/%BFc%F3mo-ingreso-al-phpmyadmin.html
          (ISO/IEC 8859-1    %BF = ¿    %F3 = ó)

Это правильно разрешается в следующий абсолютный URI:

http://www.elserver.com/ayuda/content/21/65/es/content/1/62/es/%BFc%F3mo-ingreso-al-phpmyadmin.html

Который производит дублированный контент. Очевидно, это ошибка, допущенная на веб-сайте, которую легко проверить с помощью тестирования:

http://www.elserver.com/ayuda/content/1/62/es/%BFc%F3mo-ingreso-al-phpmyadmin.html

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

Вы могли бы, например...

  • ... сравните содержимое для дубликатов самостоятельно, например. создайте контрольную сумму содержимого MD5 и SHA-1 и сохраните список. Если обе контрольные суммы одинаковы, весьма вероятно, что содержимое тоже одинаковое.
  • ... решить, что, если URI становятся слишком длинными, они не работают.
  • ... установить машинное обучение, чтобы узнать, какие шаблоны URL создают дублированный контент.
  • ... создайте «достаточно хорошие, чтобы попробовать» URI, если есть некоторое совпадение между базовым URI и относительным URI, данным для обнаружения такого рода проблем. Проверьте, работают ли эти URI.

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

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

person hakre    schedule 24.09.2012
comment
Большое спасибо, Хакра, это хороший подход, и я согласен, URL-адреса вообще не искажены. Я должен отредактировать вопрос. Что касается пункта 2 и 3, проблема не в нашем коде, а в некоторых веб-приложениях. Если вы хотите понять, что я имею в виду, вы можете посмотреть здесь и нажать «Администрирование MySQL»: elserver.com/ayuda/content/21/65/es - person Chris Russo; 24.09.2012
comment
Только что обновил вопрос, теперь должно быть легче понять проблему :) - person Chris Russo; 24.09.2012
comment
@ChrisRusso: обновил ответ, данные, которые вы предоставили, намного лучше объясняют его. Но нет готовой библиотеки, которая решит это за вас, по крайней мере, мне неизвестно. Я бы сказал, что вам нужно немного творчески подойти к тому, как вы хотите справиться с этим. - person hakre; 24.09.2012
comment
Большое спасибо за помощь, теперь я полностью с вами согласен, в настоящее время мы пытаемся создать несколько алгоритмов, которые позволили бы нам определить, когда система зацикливается, мы уже сравниваем источники, используя что-то очень похожее на процесс MD5, который вы ранее описано. Однако я считаю, что можно предсказать что-то подобное, когда результаты parse_url начинают повторять информацию в параметре пути. Я думаю, мы подойдем к проблеме таким образом, а затем сравним результаты с аналогичными адресами. Еще раз спасибо. - person Chris Russo; 24.09.2012
comment
Да, этот прогноз немного связан с машинным обучением. Вы бы создали мир, в котором алгоритм может принимать решения и на основе проверок дублированного контента может определить, было ли решение правильным или неправильным. Однако вам нужно решить, стоит ли программировать такую ​​систему. - person hakre; 24.09.2012