2014-04-28 5 views
1

URL이 많은 텍스트 파일이 있습니다. URL 중 일부는 www.http://으로 시작하며 일부는 시작되지 않습니다.www를 추가하는 방법. 텍스트 파일에 URL을 입력하십시오.

URL이 www. 또는 http://으로 시작하지 않는 텍스트 파일의 모든 줄 앞에 www.을 추가하고 싶습니다.

$lines = file("sites.txt"); 

foreach($lines as $line) { 
    if(substr($line, 0, 3) != "www" && substr($line, 0, 7) != "http://") { 

    } 
} 

그 코드는 지금 있습니다. 별로 많지는 않지만 모든 일치하지 않는 행 앞에 www.을 추가하는 방법에 대한 단서가 없습니다.

+0

당신이 이미 가지고있는 코드를 보여, 그래서 우리는 당신이 원하는 경우 문을 확장 할 수 있습니다하십시오. – DanFromGermany

+0

그냥 어떻게하는지 묻는 대신, 이미 시도한 것을 보여줄 수 있습니까? – Aravona

+0

어떤 정규 표현식을 시도해 보셨습니까? –

답변

3

이 본 www.하지 않을 경우를 추가하고 HTTP/HTTPS 발견 된 라인에이 경우 작동합니다.

$url = preg_replace("#http(s)?://(?:www\.)?#","http\\1://www.", $url); 

이 정규식은 다음에서 작동합니다 :

domain.ext ->http://www.domain.ext
www.domain.ext ->http://www.domain.ext
http://www.domain.ext ->http://www.domain.ext
https://domain.ext ->https://www.domain.ext (httpS 참고)
https://www.domain.ext ->https://www.domain.ext (httpS에 유의하십시오)


는 정규식 설명 :
http(s)?:// ->는 HTTP의 S는, 거기 그것이 경우에 저장하지 않을 수 있습니다.
(?:www\.)? ->www.이 없을 수 있습니다. 저장하지 마십시오 (?:), 우리는 어쨌든 그것을 추가 할 것입니다.

그런 다음 대체 값에 \\1을 사용하여 http ** S **가있을 때 작동하도록 허용합니다.
또한 1 문자 길이 때문에 모든 문자열 substr은 https에서 실패합니다.

foreach($lines as &$line) { // note the '&' 

    // http:// and www. is missing: 
    if(stripos($line, 'http://www.') === false) { 
     $line = 'http://www.' . $line; 

    // only http:// is missing: 
    } elseif(stripos($line, 'http://www.') !== false && stripos($line, 'http://') === false) { 
     $line = 'http://' . $line; 

    // only www. is missing: 
    } elseif(stripos($line, 'http://') !== 0 && stripos($line, 'www.') !== 0) 
     $line = 'http://www.' . str_replace('http://', '', $line); 

    // nothing is missing: 
    } else { 
    } 
} 

참고 :

는 단순히 www가 아닌 ​​도메인에 www.를 추가하는 때문에 잘못 될 수

+0

그것은 모든 regex 솔루션했다. – Martijn

2

트릭은 당신이 그들을 변경할 수 있도록 참조 $lines을 전달하는 것입니다 www.example.comexample.com CAN은 완전히 다른 내용, 다른 서버, 다른 대상, 다른 DNS 매핑을 가질 수 있습니다. http://을 추가하는 것이 좋지만 www.을 추가하지 않는 것이 좋습니다.

다시 파일에 새로운 배열을 작성하려면 사용하십시오 : 만 3 라인 :

file_put_contents(implode(PHP_EOL, $lines), 'sites.txt'); 
+2

이 또한 텍스트 파일의 행을 대체합니까? – user3552670

+0

@ user3552670 아니요,하지만'file_put_contents'를 사용하여 업데이트했습니다. – DanFromGermany

+2

httpS 항목이있는 순간 실패합니다. 문제가 아니라 단지 메모 일 수도 있습니다. – Martijn

0
$lines = file("/var/www/vhosts/mon.totalinternetgroup.nl/public/sites/sites.txt"); 
$new_lines = array(); 
foreach($lines as $line) { 
    if(substr($line, 0, 3) != "www" || substr($line, 0, 7) != "http://") { 
     $new_lines[] = "www.".$line; 
    }else{ 
     $new_lines[] = $line; 
    } 
} 

$content = implode("\n", $new_lines); 
file_put_contents("/var/www/vhosts/mon.totalinternetgroup.nl/public/sites/sites.txt", $content); 
+0

이 또한 텍스트 파일의 행을 대체합니까? – user3552670

+0

이제 텍스트 파일로 대체 할 코드를 추가했습니다. –

0

사용이!

<? 
    $g0 = file_get_contents("site"); 
    #-------------------------------------------------- 
    $g1 = preg_replace("#^http://#m","",$g0); 
    $g2 = preg_replace("/^www\./m","",$g1); 
    $g3 = preg_replace("/^/m","http://",$g2); 
    #-------------------------------------------------- 
    file_put_contents("site2",$g3); 
?> 

입력 파일

1.com 
www.d.som 
http://ss.com 
http://www.ss.com 

출력 파일 :

http://1.com 
http://d.som 
http://ss.com 
http://ss.com 
+0

당신은 정규식이지만, 정규식의 힘을 사용하지 마십시오. 대신 느린 regex-functionality를 3 번 ​​실행하여 머리말을하면 기본 문자열이 함수를 대체합니다 .... – Martijn

+0

@Martijn :하지만 초보자도 쉽게 이해할 수 있습니다! –

+0

Heheh, 나는 반대하지만 대체 솔루션은 좋은 것일 수 있습니다. 이것은 대용량 파일에서 너무 느릴 것입니다. – Martijn

관련 문제