2017-09-27 1 views
1

URL을 비교하고 배열에서 중복을 제거해야하지만 URL 만 호스트를 비교하고 싶습니다. 내가 비교할 때 나는 스킵 http와 https를 필요로한다. 내가 배열이있을 때 그래서 :URL 배열에서 호스트 이름을 비교하고 고유 한 값을 얻습니다.

$urls = array_udiff($urls, $urls, function ($a, $b) { 
       return strcmp(preg_replace('|^https?://(www\\.)?|', '', rtrim($a,'/')), preg_replace('|^https?://(www\\.)?|', '', rtrim($b,'/'))); 
      }); 

그러나 그것은 나에게 빈 배열을 반환 :

$urls = array(
'http://www.google.com/test', 
'https://www.google.com/test', 
'https://www.google.com/example', 
'https://www.facebook.com/example', 
'http://www.facebook.com/example'); 

결과는

http://www.google.com/test 
http://www.google.com/example 
http://www.facebook.com/example 

내가 좋아하는 비교하려 할 것이다. 그런 다음

<?php 
function parseURLs(array $urls){ 
    $rs = []; 
    foreach($urls as $url){ 
     $segments = parse_url($url); 
     if(!in_array($segments['host'], $rs)) 
      $rs[] = $segments['host']; 
    } 
    return $rs; 
} 

:

+0

regex 태그를 추가 할 수 있습니다. – charlesreid1

+0

[this] (http://php.net/manual/en/function.parse-url.php) – gmc

+0

을 살펴보십시오. 그러나 어디에서 실제 예제 나 아이디어를 보여줄 수 있습니까? – LukeKov

답변

1
<?php 
    $urls = array(
    'http://www.google.com/test', 
    'https://www.google.com/test', 
    'https://www.google.com/example', 
    'https://www.facebook.com/example', 
    'http://www.facebook.com/example'); 


$MyArray = []; 
for($i=0;$i<count($urls);$i++) { 

preg_match_all('/www.(.*)/', $urls[$i], $matches); 

    if (!in_array($matches[1], $MyArray)) 
     $MyArray[] = $matches[1]; 
} 

echo "<pre>"; 
print_r($MyArray); 
echo "</pre>"; 

을 그리고 출력은

Array 
(
    [0] => Array 
     (
      [0] => google.com/test 
     ) 

    [1] => Array 
     (
      [0] => google.com/example 
     ) 

    [2] => Array 
     (
      [0] => facebook.com/example 
     ) 

) 

손질 만 호스트 이름을 유지하고있다

+0

나는 나의 질문을 업데이 트했다. 모든 호스트 이름을 모두 비교할 필요가 있습니다. 예를 들어 http : //www/google.com/test와 같은 호스트 이름을 모두 비교해야합니다. 배열에 google.com/test가 있는지 확인하고 중복 코드가 있으면 코드 제거가 필요하지만 호스트 이름 뒤에 모든 방문 페이지 모두를 비교해야합니다. – LukeKov

+0

새 정규식으로 내 답변을 업데이트했습니다. 그것이 효과가 있다면 받아들이십시오. – pr1nc3

+0

그게 아직 동일하지 도메인 이름 전에 모두 제거해야합니다. 나는^https와 같은 생각을 했습니까? : // (www \\.)? – LukeKov

0

이 방법을 시도

<?php 
$urls = array(
    'http://www.google.com', 
    'https://www.google.com', 
    'https://www.google.com/', 
    'https://www.facebook.com', 
    'http://www.facebook.com' 
); 
$uniqueURLs = parseURLs($urls); 
print_r($uniqueURLs); 

/* result : 
Array 
(
    [0] => www.google.com 
    [1] => www.facebook.com 
) 
*/ 
+0

하나의 질문이 있습니다. hostanme와 경로를 http://www.google.com/test와 비교하고 google.com/test 만 비교하려면 어떻게해야합니까? – LukeKov

+0

기본적으로 URL을 추출하기 위해 ['parse_url'] (http://php.net/manual/en/function.parse-url.php)을 사용합니다.이 함수는 경로도 반환합니다. parseURLS fn을 약간 수정하여 경로 값을 확인하십시오. [여기] (https://gist.github.com/tajhulfaijin/a623772931919886d9ea2cc9b84e90cd) – mrJ0ul3

0

당신은 PHP의 url_parse() 기능으로 URL의, 구문 분석 URL을 통해 루프를 필요로하고 배열에서 중복을 제거하는 array_unique를 사용, 그래서 우리는

내가 당신을 위해 클래스를 작성했습니다 .. 호스트와 경로를 모두 확인됩니다

당신이 파일을 분리해서 할 필요가 없습니다하지만 당신은 하나 개의 PHP 파일을 사용하는 경우 include_once 문을 제거해야합니다 경우 당신은 하나 개의 파일에 그것을 할 수있는 클래스

<?php 
//Inlcude tghe Parser 
include_once "Parser.php"; 

    $urls = array(
    'http://www.google.com/test', 
    'https://www.google.com/test', 
    'https://www.google.com/example', 
    'https://www.facebook.com/example', 
    'http://www.facebook.com/example'); 
    //Instantiate 
    $parse = new Parser(); 
    $parse->arrayValuesUrlParser($urls); 

?> 

를 사용

<?php 
/** Get Unique Values from array Values **/ 
Class Parser { 
    //Url Parser Function 
    public function arrayValuesUrlParser($urls) { 
     //Create Container 
     $parsed = []; 
     //Loop Through the Urls 
     foreach($urls as $url) { 
      $parse = parse_url($url); 
      $parsed[] = $parse["host"].$parse["path"]; 
      //Delete Duplicates 
      $result = array_unique($parsed); 
     } 
     //Dump result 
     print_r($result); 
    } 

} 

?> 

. 이 클래스는 PHP 클래스에도 있으며 재미있게 해 봤습니다!

행운을 빈다.

+0

만약 내가 비교할 방문하려는 경우 내 상륙 페이지 내 질문이 업데이트되었습니다 – LukeKov

+0

당신은 이것을 간단히 연결합니다. $ parse [ "path"]; 클래스를 업데이트했습니다. –

+0

경로 뒤에 쿼리가 있으면 어떻게 될까요? 그리고 두 번째로 이것이 www를 취한다고 생각합니다. 나는 때때로 www가없는 url을 가지고있다 – LukeKov

관련 문제