2014-12-16 10 views
-1

내 코드가 제어 할 수없는 문자열을받는 중입니다.이 문자열은 $ my_string을 호출합니다. 문자열은 사본의 내용입니다. 문자열을 에코로 표시하면 다음과 같이 표시됩니다.여러 줄 문자열에서 특정 줄을 제거하려면 어떻게합니까?

echo $my_string; 

나는 이와 비슷한 내용을 볼 수 있습니다. 그냥 실제 단어가 모든 시간을 의미 라인, 또는 순서를 제거하는, 말, 그래서 내가하고 싶은 무엇

1 
00:00:00.000 --> 00:00:04.980 
[MUSIC] 

2 
00:00:04.980 --> 00:00:08.120 
Hi, my name is holl and I am here 
to write some PHP. 

3 
00:00:08.120 --> 00:00:10.277 
You can see my screen, here. 

함수를 통해이 실행됩니다.

[MUSIC] 
Hi, my name is holl and I am here 
to write some php. 
You can see my screen, here. 

내 생각은 ...과 같이, 빈 중 어느 한 라인 감지하거나 숫자로 시작 휴식에 의해 전체 문자열을 폭발하고 시도

 $lines = explode("\n", $my_string); 
     foreach ($lines as $line) { 
     if (is_numeric(line[0]) || empty(line[0])) { 
      continue; 
     } 
     $exclude[] = $line; 
     } 
     $transcript = implode("\n", $exclude); 

그러나 결과입니다 이 동작의 결과는 정확히 동일합니다. 출력에는 숫자와 빈 줄이 있습니다. 나는 분명히 어떤 것을 오해하지만 그게 무엇인가? 그리고 내 목표를 달성하기위한 더 좋은 방법이 있습니까?

감사합니다.

편집 : 내 코드에서 실제로 하나를 사용하지 않는 곳에서 echo를 제거했습니다. 논문에게 줄을 제거하는

+0

자막 편집? –

+0

'\ n' 대신'\ r \ n '이 될 수도 있습니다. 그리고 prob 2가 있습니다. \ r \ n \ r \ n – AbraCadaver

+0

출력을 다른 파일에 쓰는 동안 무시하십시오. – developerwjk

답변

1

코드가 거의 작동합니다. $ [in] 라인에서 $를 잊었으며 ""은 비어 있지 않습니다().

$my_string = <<< EOF 
1 
00:00:00.000 --> 00:00:04.980 
[MUSIC] 

2 
00:00:04.980 --> 00:00:08.120 
Hi, my name is holl and I am here 
to write some PHP. 

3 
00:00:08.120 --> 00:00:10.277 
You can see my screen, here. 
EOF; 

$lines = explode("\n", $my_string); 
foreach ($lines as $line) { 
    $temp = trim($line[0]); 
    if (is_numeric($temp) || empty($temp)) { 
     continue; 
    } 
    $exclude[] = $line; 
} 
$transcript = implode("\n", $exclude); 

echo $transcript; 

결과 :

[MUSIC] 
Hi, my name is holl and I am here 
to write some PHP. 
You can see my screen, here. 
+0

이 코드는 나머지 코드에서 적용했으며 매우 잘 작동합니다. 내 실수를 지적 해 주셔서 감사합니다! – holl

0

는 사용하려고 : preg_replace이다 + 정규식

PHP 남자 [1] :에 의해 대체

$lines = explode("\n", $my_string); 
foreach ($lines as $line) { 
    if (is_numeric(line[0]) || empty(line[0])) {//index usage? 
     continue; 
    } 
    $exclude[] = $line; 
} 
$transcript = echo implode("\n", $exclude); //remove echo 

: http://php.net/manual/en/function.preg-replace.php

+0

만약'preg_replace'가 정답이라면 (부분적으로는 그럴 수 있음), 정교해야합니다. 나는 일을해야하거나 답에 가까운 OP를 얻는 예제를 제공 할 것을 제안합니다. 그렇지 않으면 링크를 코멘트로 남겨 두십시오. 그리고 대답이 정말로 "정규 표현식 사용"일 뿐이라면, OP가 정규 표현식을 사용하는 방법을 알지 못할 가능성이 있습니다 (또는 전혀). – Jakar

2

문제는 당신이 $ 행에 색인을 사용하는 것입니다 :

$lines = explode("\n", $my_string); 
foreach ($lines as $line) { 
    if (is_numeric($line) || empty($line)) {//here 
     continue; 
    } 
    $exclude[] = $line; 
} 
$transcript = implode("\n", $exclude); 

또한를 제거하려면 정규 표현식이 필요합니다.파편.

당신은으로 그들을 결합 할 수 있습니다

$lines = explode("\n", $my_string); 
foreach ($lines as $line) { 
    if(preg_match('/^(|\d+|\d+:\d+:\d+\.\d+\s+-->\s+\d+:\d+:\d+\.\d+)$/',$line)) { 
     continue; 
    } 
    $exclude[] = $line; 
} 
$transcript = implode("\n", $exclude); 
echo $transcript; 

(php -a 포함) :

if(preg_match('/^(|\d+|\d+:\d+:\d+\.\d+\s+-->\s+\d+:\d+:\d+\.\d+)$/',$line)) { //regex 

계정에 모든 가능성을 소요 그것은을처럼

$ php -a 
php > $my_string='1 
php ' 00:00:00.000 --> 00:00:04.980 
php ' [MUSIC] 
php ' 
php ' 2 
php ' 00:00:04.980 --> 00:00:08.120 
php ' Hi, my name is holl and I am here 
php ' to write some PHP. 
php ' 
php ' 3 
php ' 00:00:08.120 --> 00:00:10.277 
php ' You can see my screen, here.'; 
php > $lines = explode("\n", $my_string); 
php > foreach ($lines as $line) { 
php {  if(preg_match('/^(|\d+|\d+:\d+:\d+\.\d+\s+-->\s+\d+:\d+:\d+\.\d+)$/',$line)) { 
php {   continue; 
php {  } 
php {  $exclude[] = $line; 
php { } 
php > $transcript = implode("\n", $exclude); 
php > echo $transcript; 
[MUSIC] 
Hi, my name is holl and I am here 
to write some PHP. 
You can see my screen, here. 
1

같습니다 무늬. 즉 첫 번째와 두 번째 줄마다 메타 데이터가 있고 세 번째 줄은 텍스트이고 네 번째 줄은 비어 있습니다. 그것이 사실이라면, 그것은 사소한 것이어야합니다. 당신은 전혀 내용을 확인하고 바로 모든 중주의 세 번째 줄 잡아 필요가 없습니다 : 당신이 정당하게 여러 줄의 텍스트가있을 수 있습니다 언급 한 바와 같이 있기 때문에, 다른 논리와

$lines = explode("\n", $my_string); 
$texts = array(); 
for ($i = 0; $i < count($lines); $i++) { 
    if ($i % 4 == 2) { // Index of third line is 2, of course. 
    $texts[] = $lines[i]; 
    } 
} 

$transcript = implode($texts, "\n"); 

을, 당신은 말할 수 호출 한 블록/항목은 빈 줄로 구분됩니다. 각 블록은 두 줄의 메타 데이터로 시작하여 하나 이상의 (또는 아마도 제로) 또는 그 이상의 텍스트 줄이 뒤 따른다.

$lines = explode("\n", $my_string); 
$texts = array(); 
$linenr = 0; 
foreach ($lines as $line) { 
    // Keep track of the how manieth non-empty line it is. 
    if ($line === '') 
    $linenr = 0; 
    else 
    $linenr++; 

    // Skip the first two lines of a block. 
    if ($linenr > 2) 
    $texts[] = $line; 
} 

$transcript = implode($texts, "\n"); 

나는이 특정 형식을 모르겠지만, 내가이 일을 원하는 경우,이 같은 패턴을 찾을 수 열망보다는 라인 자체를 구문 분석 : 그 논리를 사용하면 다음과 같은 구문 분석 할 수 . 그것은 스크립트 또는 자막 파일처럼 보입니다. 만약 누군가가 '300'이라고 소리를 지르면 그것은 수치 스러울 것입니다. 그리고 그것은 transcript되지 않을 것입니다.

+0

나는 그것을 원한다. 그러나 항상 그런 것은 아니다. 나의 예제에서, 부분적으로 '2'는 대화가 두 줄로 나뉘는 것을 볼 수 있습니다. 1과 3에서 '대화'는 단 한 줄입니다. – holl

+0

나는 그 부분을 간과했다. 그럼에도 불구하고 나는 패턴을 찾는 것이 일반적으로 선을 파싱하는 것보다 나은 접근 방법이라고 생각한다. 수치를 테스트하면 성적표의 줄은 숫자로만 구성 될 수 없지만 아마도 단순한 패턴 (빈 줄이 구분 기호로 표시됨)이있을 것입니다. 두 번째 코드 시도를 추가했습니다. – GolezTrol

관련 문제