2016-06-09 1 views
2
<span class="itemopener">82 top</span>&nbsp;<span class="allopener">all</span> 

에서 파일을 대체 어떻게에 위 변경할 수 있습니다검색 및 디렉토리

<span class="itemopener">top</span>&nbsp;<span class="allopener">82</span> 

PHP와 주변 사람들 HTML 조각의 30가 포함 된 HTML 파일을.

참고 : (82)는 또한, 나는 검색을 실행하고 8000의 각각에 대해 한 번 대체 할 내가 디렉토리에 배치 새 파일에서이 스크립트를 실행하려면 1.

위의 임의의 정수가 될 수 그 디렉토리에 HTML 파일 (스크립트가 한 번도 입력 제한 시간 안 - 아마도 몇 가지 피드백을.)

+0

내가 언데드인지 보자. rstand : 스크립트가 8000 개의 HTML 파일을 읽고 한 줄을 검색하고 각 파일에서 다른 줄로 바꾸려면 스크립트를 원하십니까? –

+0

디렉토리에 있습니다. 8000 htm 파일. 각 파일에는 약 30 개의 타겟 스 니펫이 변경되어야하는 큰 텍스트 슬랩이 있습니다. 그래서 약 8000 * 30 대체. – Adrian33

+0

여기 예제 페이지가 있습니다 : http://hackerbra.in/unlisted/best_1360386661.htm – Adrian33

답변

1
내가 @Jimmmy에 의해 생성 기능을 사용하고

가 (때문에 d{1,5}에 의해 범위 d{2} 교체 "참고 : (82)가 1 위의 임의의 정수가 될 수 있습니다") 및 파일 검색을 추가 (그것을 테스트하고 잘 작동) :

<?php 

function replace($row){ 
    $replaced = preg_replace_callback("~(\<span class=\"itemopener\"\>)(\d{1,5})\s(top\</span\>.*\<span class=\"allopener\"\>).{3}(\</span\>)~iU", function($matches){ 
     $str = $matches[1] . $matches[3] . $matches[2] . $matches[4]; 
     return $str; 
    }, $row); 
    return $replaced; 
} 

foreach (glob("*.html") as $file)   // GET ALL HTML FILES IN DIRECTORY. 
{ $lines = file($file);      // GET WHOLE FILE AS ARRAY OF STRINGS. 
    for ($i = 0; $i < count($lines); $i++) // CHECK ALL LINES IN ARRAY. 
    $lines[ $i ] = replace($lines[ $i ]); // REPLACE PATTERN IF FOUND. 
    file_put_contents($file,$lines);   // SAVE ALL ARRAY IN FILE. 
} 
?> 
+1

호세에게 감사합니다. 몇 시간 만에 확인할 수 있습니다. 죄송합니다. – Adrian33

+0

정수와 잘 어울린다고 생각하지 않았습니다. 내 대답을 편집 할 것입니다. – Jimmmy

2

내가 행의 교체 기능을 썼다

function replace($row){ 
    $replaced = preg_replace_callback("~(\<span class=\"itemopener\"\>)(\d{1,5})\s(top\</span\>.*\<span class=\"allopener\"\>).{3}(\</span\>)~iU", function($matches){ 
    $str = $matches[1] . $matches[3] . $matches[2] . $matches[4]; 
    return $str; 
    }, $row); 
    return $replaced; 
} 

$s = '<span class="itemopener">82 top</span>&nbsp;<span class="allopener">all</span>'; 
$replaced = replace($s); 

echo "<pre>" . print_r($replaced, 1) . "</pre>"; 
exit(); 

Working demo of the function

파일을 한 행씩 가져 와서 교체 할 범위가 있는지 간단히 확인하면이 기능으로 보낼 수 있습니다. 그러나 지정한 파일 수가 많으면 시간이 오래 걸릴 것입니다 . 당신이 내 대답 사용할 수 있습니다 경로에있는 모든 파일 검사를 위해

: 만이 .htm 파일을 읽고 수정하고, 당신이 원하는 무엇을 구조 당신에게 반환 할 수 있습니다 약간의 편집 후 scandir 을 ..

그런 다음 스캔 된 모든 HTM 파일을이 같은 그들을 처리 : 실행 그리고 ..

$allScannedFiles = array("......"); 
foreach($allScannedFiles as $key => $path){ 
    $file = file_get_contents($path); 
    $lines = explode(PHP_EOL, $file); 
    $modifiedFile = ""; 
    foreach($lines as $line){ 
     if(strpos($line, "span") && strpos($line, "itemopener")){ 
      $line = replace($line); 
     } 
     $modifiedFile .= $line . PHP_EOL; 
    } 
    file_put_contents($path, $modifiedFile); 
} 

나는 머리에서 이렇게 몇 가지 테스트가 필요하다이 하나 개의 조각을 썼다 을 가서 자신에게 커피를 만들고 기다립니다) 시간이 초과되면 PHP 시간 초과를 늘릴 수 있습니다. 이 작업을 수행하는 방법에 & 여기에 대답 질문한다 : how to increase timeout in php

는 다른 방법이있는 DOMDocument로로드 파일을 시도하고 파일에 어딘가에 유효한 HTML이 아닌 경우 documentation of DomDocument이 그러나, 그것은 당신에게 문제가 발생할 수 있습니다 클래스에 교체 할 수 있습니다 ..

+0

thx ..이 기능은 작동하지만 실제로 모든 파일을 수락하도록 실행하는 데 완전한 대답이 필요합니다. – Adrian33

+1

내 답변을 편집 했으므로 모든 일을하는 방법에 대한 힌트가 포함되어 있습니다. – Jimmmy

+0

거의 잊어 버렸습니다 (+1). –