2015-01-20 1 views
0

У меня возникли проблемы с удалением части строки внутри текстового файла с php.PHP Удалить строку из большей строки с переменными

У меня есть большой файл, и мне нужно удалить часть строки этого файла.

Дело в том, что линия не всегда одинакова. Он сохраняет формат, но цифры меняются. Вот пример:

< /td >This is the line< /td >and this< /td >is < /td >the < /td >part< /td >want to remove< /td >Name< /td > after it keeps going < /td > a loong way < /td >

Я хотел бы удалить из </TD> после слова это до </TD> после имени.

мне было интересно, если есть в любом случае из Макин PHP не удалять в обратном порядке от имени до X числа встречаемости от </TD>, что-то вроде:

Удалите из имени до 4-го появления </TD>

Надеюсь, что кто-то может мне помочь ....

Оба ниже ответа делают трюк для текста, но они не работают для моего реального кода. Так вот часть реального кода:

... </тд> </тр> < тр> < тд OnMouseOver = "dm.v (это, 1);" onmouseout = "dm.u (это);" id = "mnFE0BBC45_i8" onclick = "dm.ItClk (this, \ '\'); cmn.href (\ 'indexall.php \', \ '\');" class = "mn31BBMainMenuItemTD"> < Таблица border = "0" cellspacing = "0" cellpadding = "0"> < tr> < td class = "mn31BBIconTD"> < font class = "MG_Icons"> & #xe 746; </FONT> </тд> < тд класс = "mn31BBTitleTD" ID = "mnFE0BBC45_i8-ТЛ"> OTHER_NAME </тд> < тд класс = "mn31BBArrowTD">   </TD> </тр> </table> </td> </tr> < tr> < td onmouseover = "dm.v (this, 1);" onmouseout = "dm.u (это);" id = "mnFE0BBC45_i3" onclick = "dm.ItClk (this, \ '\'); cmn.href (\ 'index.php \', \ '\');" class = "mn31BBMainMenuItemTD"> < Таблица border = "0" cellspacing = "0" cellpadding = "0"> < tr> < td class = "mn31BBIconTD"> < font class = "MG_Icons"> & #xe 746; </FONT> </тд> < тд класс = "mn31BBTitleTD" ID = "mnFE0BBC45_i3-ТЛ">Имя </тд> класс = "mn31BBArrowTD"   </TD>/тр/таблица </TD> </tr> < tr> < onmouseover = "dm.v (th is, 1);" onmouseout = "dm.u (th is);" id = "mnFE0B BC45_i5" oncli ck = "dm.ItC lk (t his, \ '\'); cmn.h ref (\ 'indexd2.php \', \ '\');" класс ...

Это лишь небольшая часть кода (это Javascript Menu), есть пробелы во всех тегах (< tr>), чтобы увидеть их ....

текст я хочу, чтобы удалить это:

</тд> < тд класс = "mn31BBArrowTD">   </TD> </тр> </table> </TD> </TR> < tr> < td onmouseover = "dm.v (это, 1);" onmouseout = "dm.u (это);" id = "mnFE0BBC45_i3" onclick = "dm.ItClk (this, \ '\'); cmn.href (\ 'index.php \', \ '\');" class = "mn31BBMainMenuItemTD"> < Таблица border = "0" cellspacing = "0" cellpadding = "0"> < tr> < td class = "mn31BBIconTD"> < font class = "MG_Icons"> & #xe 746; </FONT> </тд> < тд класс = идентификатор "mn31BBTitleTD" = "mnFE0BBC45_i3-ТЛ">Имя

И mnFE0BBC45_i3-ТЛ и mnFE0BBC45_i3 не всегда то же самое, число меняется в зависимости от Имя.

Это путь я хочу сделать: Удалить все из Название к 4-му из < Внешность/TD>

+0

код выше недействителен HTML ('' нуждается в открытии и закрытии тег). Это намеренно? – rwacarter

+0

Это слово «Имя» будет присутствовать в каждом текстовом файле. а также, как долго текст – Afsar

+0

намеренно ... это всего лишь пример ... в реальном файле каждый < /td > имеет свои – Ebarriosjr

ответ

1

неправильно требование в первую очередь; вот исправленная версия, которая ищет соответствующие совпадения перед «Name».

Между другими вхождениями «< \ td>« Я ищу только буквенно-цифровые символы и пробелы. Это может быть необходимо, чтобы добавить больше к этому классу символов, как тир или подчеркиванию ([[цифра, буква] \] +)

<?php 
$txt = '</td>This is the line</td>and this</td>is the part</td>want to remove</td>Name</td> after it keeps going </td> a loong way </td>'; 

$replacement = preg_replace('/([[:alnum:]\ ]+<\s*\/td\s*>){2,2}Name<\s*\/td\s*>/', '', $txt); 
echo "$replacement \n"; 
?> 

Выход:

</td>This is the line</td>and this</td> after it keeps going </td> a loong way </td> 

Edit:

Здесь это небольшой скрипт на Perl, который делает то, что вы хотите:

#!/usr/bin/perl 
# 

use strict; 
use warnings; 

open(my $fh, "<", "input.txt") 
        or die "cannot open < input.txt: $!"; 
my $content = do { local $/ = <$fh> }; 
close($fh); 

my $anchor = ">Name<"; 
my $position = 0; 
# find occurences of anchor in the text 
while ($position = index($content, $anchor, $position)) { 
    if ($position == -1) { 
     last; 
    } 
    print "anchor $anchor is at $position \n"; 
    # go backwards to the starttag of the anchor (has to be a td element) 
    my $starttag_position = rindex($content, "< td", $position); 
    print "starttag of anchor is at $starttag_position \n"; 
    my $start = $starttag_position; 
    # look backwards to closing tds 
    for (my $i = 0; $i < 4; $i++) { 
     $start = rindex($content, "</td>", $start - 1); 
     if ($start == -1) { 
      die("less than 3 tds found before $anchor"); 
     } 
    } 
    print "first td is at $start \n"; 
    # delete the text in between 
    substr($content, $start, $starttag_position - $start, ""); 
} 

open(my $fout, ">", "input.new") 
        or die "cannot open > input.new: $!"; 
print $fout $content; 
close $fout; 
+0

Можете ли вы попробовать с новым кодом, который я написал в вопросе? Я не могу заставить его работать ... – Ebarriosjr

+0

Ладно, это совсем другая история. Не могли бы вы разместить больше примеров того, что вы хотите удалить? В противном случае может быть много таких испытаний. – nlu

+0

Можем ли мы использовать имя класса «mn31BBArrowTD» каким-то образом? – nlu

1

Попробуйте это:

Algo: 1) первый постион имени; 2) найдите позицию 3-го td из последних 3) затем обрезайте или создайте подстроку из этих двух позиций.

$text_string= '</td>This is the line</td>and this</td>is the part</td>want to remove</td>Name</td> after it keeps going </td> a loong way </td>'; 
$textLength = strlen($text_string); 
$first_pos= strpos($text_string,'Name'); 
$third_occurance = strrpos($text_string, '</td>', $first_pos- strlen($text_string) - 3); 
$result = substr_replace($text_string, ' ', $third_occurance /2, $textLength-$third_occurance); 
var_DUMP($result); 

Выход:

string(78) "</td>This is the line</td>and this keeps going </td> a loong way </td>" 
+0

Можете ли вы попробовать с новым кодом, который я написал в вопросе? Я не могу заставить его работать ... – Ebarriosjr