刮掉x个字符 - 怎么样?

时间:2014-02-17 17:27:10

标签: php mysql regex

背景

我拥有一个为丹麦所有心理学家编制索引的网站。 我的网站提供所有诊所的联系信息以及用户评级。

我目前正在列出12.000名心理学家,其中约有6000名拥有一个网站。大约1000名心理学家访问了我的网站,并用其他“描述性”信息(如营业时间,价格等)填写了他们的个人资料。

出于提供信息的原因,我正在尝试自动抓取(使用PHP和RegEx)那些没有向我的社区提供详细信息的网站。

我经历了一个随机的150个网站,并得出结论,超过85%的网站,有价值的文字继续“Velkommen”(=欢迎,在丹麦语)。珍贵!

问题

#1

我如何在我的剧本中具体说明,我只想抓住约。 360个字符,仅此而已。 OFC。这应该在Velkommen这个词之前(包括)。此外,脚本不应区分大小写(虽然Velkommen通常拼写为大写V,但它可以弹出另一个句子。)

此外,它应该是整个首页上最后出现的'velkommen',因为它有时会出现一个菜单/导航选项,这会很糟糕,因为我会抓住导航选项。

#2

目前 - 我的脚本将信息保存在数组中,然后保存在数据库中。

不确定我该如何做到这一点。 SEO的最佳选择;

  1. 将已删除的文本保存在MySQL中并每次都显示。
  2. 每次[跟随'Velkommen']
  3. 渲染相同的360个字符的文本
  4. 每次有人在我的网站上查看特定的心理学家时,都会从网站上呈现随机的360字符文字。
  5. 示例网站:

    $web = "http://www.psykologdorthelau.dk/";
    $website = file_get_contents ($web);
    
    preg_match_all("/velkommen.+?/sim", $website, $information);
    
    //THIS SHOULD SPECIFICY THE VERY LAST 'VELKOMMEN' - it doesn't, I know :(
    for($i = 0; $i < count($information[0]); $i++){
    
    preg_match_all("/Velkommen (.+?)\"/sim", $information[0][$i], $text, PREG_SET_ORDER);
    
    $psychologist[$i]['text'] = mysql_real_escape_string($text[0][1]);
    }
    

    感谢所有能够解决这个难题的人,来自这个美妙的丹麦国家。

2 个答案:

答案 0 :(得分:1)

如果您只想获取一定数量的数据,可以使用文件流。

它看起来像这样:

$handle = fopen("http://www.example.com/", "r"); // open a filestream
// Fetch for example only 10 bytes each time we check
$chunkSize = 10;
$contents = "";
while ( !feof( $handle ) && strlen($contents) < 360) { 
    $buffer = fread( $handle, $chunkSize ); 

    $contents .= $buffer;

} 
$status = fclose( $handle ); 

//your data is stored in $contents

答案 1 :(得分:1)

“被删除的数据应该在'velkommen'这个词之前”:

preg_replace_callback('/velkommen(.*){360}/i',
  function($matched) {
    // Use $matched[1] to perform further testing
  },
  $contents
);

这很hacky,但它会让你开始。我相信需要PHP 5.4。