Tricky desen maç

5 Cevap php

Bu, zor kolay ya da imkansız olabilir ... Ben emin değilim

Ben etki bir listesi var ve ben "title" etiketi sitesi adına mümkün olduğunca yakından onları maç çalışıyorum.

Örneğin ...

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

Yani burada sorun görebilirsiniz. Ben durumda, boşluk ve herhangi bir etki alanı özel karakterleri dikkate almak gerekir. Ben de benzeri herhangi bir özel karakterleri yakalamak gerekiyor! Yahoo! ama sadece bir cümle sonu ve her ne olursa olsun aklınıza gelebilecek olacak bir dönem gibi bir şey.

Mantıklı?

PHP.

Ben gerçekten, gerçekten desen eşleştirme sorunları bu tür emmek :)

5 Cevap

Ben hiç böyle bir sorun ile çalıştırabilirsiniz tüm olasılıklar çözecek bir deseni ile geleceğiz emin değilim. Bir başlık etiketi tüm maç olmaz, tamamen rastgele metin olabilir.

Örneğin, burada rastgele bir google arama kapalı aldı rastgele bir site. Sitesi alan "plus2net.com" ve başlık "PHP HTML MySQL haberler öğreticiler, ücretsiz scriptler ve programlama forum" (tabii ki SEO için tasarlanmış) olduğunu. Nasıl Hiç bu iki şey olarak ilişkilidir? Teorik olarak size istatistiksel analiz bir tür vermek için levenshtein() function gibi bir şey kullanabilirsiniz, ama ben bu sorunu çözmek için bir regexp ile geliyor yanlış bir yaklaşım olduğunu düşünüyorum.

Ben sorunu yeniden düşünmek istiyorum. Ne yapmaya çalışıyorsun? Sadece alan adları ve başlık etiketlerinin bir listesini ilişkilendirmek çalışıyorsanız, size sahip etki listeden başlık etiketleri kazımak ve kesin verileri almak için hızlı bir senaryo yazmak değil mi?

Bu kodu deneyin:

$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];
}

Eğer print_r($sites) alırsınız eğer:

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 
        )
)

Eğer sağ olsun kadar komut esneteceksiniz, ama bu başlangıç ​​için bir yer ne olursa olsun.

Sen gibi etki alanı adını dayalı bir normal ifade inşa olabilir:

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

Bu The Green Pages harf duyarsız modunda maç olacaktır.


Edit İşte böyle düzenli bir ifade oluşturmak nasıl bir örnek:

$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]);
}

Eğer seriously sorun alanı sınırlandırmak sürece, ben bu imkansız olduğunu söyleyebilirim.

Başlık özniteliği herhangi bir insan dili (semboller, yabancı karakterler, "akıllı" şeyler, bunun adı) herhangi rasgele bir dize içerebilir. Nasıl bir regex ilgili kısmını yakalamak için yeterince akıllı olacak? Hatta resmen kendi sözleriyle ilgili kısmı tanımlayabilir miyim?

Dillere uygulandığında regexes emmek, ve hatta çok daha karmaşık sistemlerin insan dillerine uygulandığında emmek eğilimindedir.

Etki listenizi sabittir? Böylece her bir etki alanı için regex inşa olsaydı?

Açıkçası, oldukça sade bir etki dışarı şerit olabilir, ama Tomalak dediği gibi, sorunun etki sürece çok daha kısıtlı olduğunu, aslında oldukça karmaşık bir hesaplama sorundur!

Bir etki, sen kelime eşleştirme çeşit, potansiyel maçları için oylama belki çeşit ile birlikte bir başvuru sözlüğü (veya her bir dil için bir tane), gerekir bunun için, kelimeleri şerit gerekir. Rağmen, gerçekten daha özel bir problem alanı olmadan bu doğru olması olası değildir.

Size ulaşmak için çalışıyoruz ne hakkında daha fazla bilgi için iyi olabilir?