2013-12-10 62 views
0

我想从一个字符串建立一个网址,那我得到的WebCrawler。我设法创建了一个爬虫程序,但是我无法创建一个URL字符串......我已经设法发现PHP函数preg_match_all弄乱了我的结果。这是我有:在PHP的编码问题的功能

preg_match_all('/"([^"]+)"/', $str, $matches); 
foreach ($matches[1] as $value) { 
    $termsArray[] = $this->createUrl($value); 
} 

的preg_match_all函数返回正确的字符串,但是,我想,编码是错误的...而createUrl功能看起来精简版这样的:

private function createLikitUrl($term) 
    { 
    $ltSymbolsArray = array(
       'a1' => 'ą', 
       'c2' => 'č', 
       'e1' => 'ę', 
       'e2' => 'ė', 
       'i1' => 'į', 
       's2' => 'š', 
       'u1' => 'ų', 
       'u2' => 'ū', 
       'z2' => 'ž', 
       '_' => ' ' 
     ); 
      $chars = preg_split("//u", $term, -1, PREG_SPLIT_NO_EMPTY); 
      $urlStr = ''; 
      foreach ($chars as $value) { 
      foreach ($ltSymbolsArray as $key => $replacement) { 
       if ($value == $replacement) { 
       $value = $key; 
       } 
      } 
      $urlStr .= $value; 
      } 
} 

的问题是当preg_match_all与具有多字节符号的字符串一起使用时,preg_split返回与$ term变量相同的字符串。如果我在不使用preg_match_all的情况下将一个字符串传递给createUrl函数,那么它完美地工作。我的猜测是,我在preg_match_all模式中缺少unicode修饰符,但我在写正则表达式时遇到困难。

安妮帮助将apreciated。

+0

哪里是你的分隔符为你使preg_split电话吗? – echochamber

+0

尝试添加'u'到preg_match_all正则表达式像'/“([^”] +)“/ u' –

+0

你的输入是什么样的? – hwnd

回答

0

不知道我理解你的要求,但我想你的脚本,它工作得很好,只是你需要在函数的末尾添加一个return $urlStr;
它必须更名为createUrl

+0

是ofcourse,它只是代码的一部分,我不明白...如果我用一个没有preg_match_all的字符串使用这个函数,那么它可以正常工作,但是如果我使用preg匹配相同的字符串,preg_split会返回相同的unsplitted)string ...只有当字符串具有anny多字节符号时才会发生这种情况。如果没有,则分割工作精细。 –

+0

@Kęstutis:正如我所说的那样,这真的很奇怪,它对我来说工作得很好,变音符号很好地改变了。 – Toto

0

我finnaly找到了解决办法。如果有人会遇到这个问题,这应该有所帮助。正如我所想,编码存在问题。我在preg_match_all之前添加了一行代码,解决了问题:

$matches = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-13'); 

干杯! :)