Хитрый матч - PullRequest
       8

Хитрый матч

2 голосов
/ 23 апреля 2009

Это может быть сложно, просто или невозможно ... Я не уверен

У меня есть список доменов, и я пытаюсь максимально приблизить их к названию веб-сайта в теге title.

Например ...

Domain: www.yahoo.com 
Title: Yahoo!
Result: Yahoo!

Domain: www.thegreenpages.com 
Title: Welcome to The Green Pages.
Result: The Green Pages

Domain: www.experts-exchange.com:
Title: Experts Exchange - The #1 resource on the web for solving technology problems.
Result: Experts Exchange

Так что вы можете увидеть проблему здесь. Мне нужно учитывать регистр, пробелы и любые доменные специальные символы. Мне также нужно захватить любые специальные символы, такие как! в Yahoo! но не что-то вроде периода, который был бы просто концом предложения и что бы вы ни думали.

Имеет смысл?

В PHP.

Я действительно, действительно, отстой в этих типах проблем сопоставления образцов:)

Ответы [ 6 ]

3 голосов
/ 23 апреля 2009

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

Например, вот случайный сайт, который я выбрал случайным поиском в Google. Домен сайта - "plus2net.com", а заголовок (очевидно, предназначен для SEO) "Учебники по статьям PHP HTML MySQL, бесплатные сценарии и форум по программированию". Как бы вы могли соотнести эти две вещи? Теоретически вы могли бы использовать что-то вроде функции levenshtein () , чтобы дать вам своего рода статистический анализ, но я думаю, что придумать регулярное выражение для решения этой проблемы - неправильный подход.

Я бы переосмыслил проблему. Что вы пытаетесь достичь? Если вы просто пытаетесь сопоставить список доменных имен и тегов заголовков, не могли бы вы написать быстрый сценарий, чтобы вычеркнуть теги заголовков из списка ваших доменов и получить точные данные?

1 голос
/ 23 апреля 2009

Я вижу, что это как минимум трехэтапный процесс.

  • Удалить пунктуацию как из заголовка, так и из URL.
  • Разделите URL, если необходимо.
  • Используйте URL, чтобы найти правильный регистр, сравнивая с заголовком.
'www.thegreenpages.com'    'Welcome to The Green Pages.'  'The Green Pages'
    'thegreenpages'                                       # remove punctuation
   'the green pages'    <= 'Welcome to The Green Pages'   # split url (if necessary)
                        =>            'The Green Pages'   # result of search

'www.experts-exchange.com'    'Experts Exchange - The #1 res ...'  'Experts Exchange'
    'experts exchange'        'Experts Exchange   The  1 res    '  # remove punctuation
#   'experts exchange'     <= 'Experts Exchange   The  1 res    '  # split url
                           => 'Experts Exchange'                   # result of search

'www.yahoo.com'    'Yahoo!'  'Yahoo!'
    'yahoo'        'Yahoo'   # remove punctuation
#   'yahoo'     <= 'Yahoo'   # split url (if necessary)
                => 'Yahoo'   # result of search
# whoops left off the exclamation point
1 голос
/ 23 апреля 2009

Попробуйте этот код:

$sites = array(
    array('domain' => 'www.yahoo.com', 'title' => 'Yahoo!'),
    array('domain' => 'www.thegreenpages.com', 'title' => 'Welcome to The Green Pages.'),
    array('domain' => 'www.experts-exchange.com', 'title' => 'Experts Exchange - The #1 resource on the web for solving technology problems.'),
);

foreach ($sites as $idx => $site) {
    $domain = preg_replace('/^www\./i', '', $site['domain']);
    $domain = preg_replace('/\.(com|net|org|info|us)$/i', '', $domain);

    $expression = '/';
    for ($i = 0; $i < strlen($domain); $i++) {
        $char = $domain[$i];
        $expression .= $char . (ctype_alpha($char) ? '' : '?');
        $expression .= '\s*';
    }
    $expression .= '/i';

    preg_match($expression, $site['title'], $matches);
    $sites[$idx]['name'] = $matches[0];
}

Если вы print_r($sites), вы получите:

Array
(
    [0] => Array
        (
            [domain] => www.yahoo.com
            [title] => Yahoo!
            [name] => Yahoo
        )

    [1] => Array
        (
            [domain] => www.thegreenpages.com
            [title] => Welcome to The Green Pages.
            [name] => The Green Pages
        )

    [2] => Array
        (
            [domain] => www.experts-exchange.com
            [title] => Experts Exchange - The #1 resource on the web for solving technology problems.
            [name] => Experts Exchange 
        )
) 

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

1 голос
/ 23 апреля 2009

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

t\s*h\s*e\s*g\s*r\s*e\s*e\s*n\s*p\s*a\s*g\s*e\s*s

Это будет соответствовать Зеленым страницам в режиме без учета регистра.


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

$data = array(
    array('yahoo', 'Yahoo!'),
    array('thegreenpages', 'Welcome to The Green Pages.'),
    array('experts-exchange', 'Experts Exchange - The #1 resource on the web for solving technology problems.')
);

foreach ($data as $item) {
    $domain = preg_split('/(.)/', $item[0], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    foreach ($domain as $key => $chr) {
        if ($chr == '-') {
            unset($domain[$key]);
        }
    }
    $pattern = '/'.implode('[\s-]*', $domain).'!?/i';
    preg_match($pattern, $item[1], $match);
    var_dump($match[0]);
}
0 голосов
/ 23 апреля 2009

Исправлен ли ваш список доменов? Если да, можете ли вы построить регулярное выражение для каждого домена?

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

Из домена вам нужно вычеркнуть слова, для которых вам понадобится справочный словарь (или по одному для каждого языка), а также какое-то совпадение слов, возможно, какое-то голосование за потенциальные совпадения. Хотя на самом деле без более конкретной проблемной области это вряд ли будет точным.

Возможно, было бы полезно узнать больше о том, чего вы пытаетесь достичь?

0 голосов
/ 23 апреля 2009

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

Атрибут title может содержать любую произвольную строку на любом человеческом языке (символы, иностранные символы, «умные» вещи, вы называете это). Как бы регулярное выражение было достаточно умен, чтобы поймать соответствующую часть? Можете ли вы даже формально определить соответствующую часть своими словами?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...