PHP 从带有变量的较大字符串中删除字符串

PHP Remove string from larger string with variables

我在使用 php.

删除文本文件中的一部分字符串时遇到了一些问题

我有一个大文件,我需要删除该文件的一部分行。

问题是线路并不总是相同的。它保留格式,但数字会改变。这是一个例子:

< /td >这是行< /td >而这个< /td >是< /td >< /td >部分< /td >想要删除< /td >Name< /td > 在它继续 < /td > 很远之后 < /td >

我想删除从< /td >之后的单词this直到< /td >之后的Name。

我想知道是否有任何方法 php 从名称中向后删除直到从 < /td > 中出现 X 号,例如:

从 Name 中删除直到第 4 次出现 < /td >

希望有人能帮助我....

下面的两个答案都适用于文本,但它们不适用于我的真实代码。所以这是真实代码的一部分:

... < /td > > < tr > < tr > < td onmouseover="dm.v(this,1);" onmouseout="dm.u(this);" id="mnFE0BBC45_i8" onclick="dm.ItClk(this,\'\');cmn.href(\'indexall.php\',\'\');" class="mn31BBMainMenuItemTD" >< table border="0" cellspacing="0" cellpadding="0" >< tr >< td class="mn31BBIconTD" > <字体class="MG_Icons"> 746;[= 89=" onmouseover="dm.v(this,1);" onmouseout="dm.u(this);" id="mnFE0BBC45_i3" onclick="dm.ItClk(this,\'\');cmn.href(\'index.php\',\'\');" class="mn31BBMainMenuItemTD" >< table border="0 " cellspacing="0" cellpadding="0" > 746; < td class="mn31BBTitleTD" id="mnFE0BBC45_i3-tl" >名称 class="mn31BBArrowTD" < /td > /tr /table < /td > > < tr > < onmouseover="dm.v(th is,1);" onmouseout="dm.u(th is) ;" id="mnFE0B BC45_i5" onclick ="dm.ItC lk(t his,\'\');cmn.h ref(\'indexd2.php\',\'\');" class...

这只是代码的一小部分(是一个Javascript菜单),所有标签(< tr >)中都有空格可以看到它们....

我要删除的文字是:

< /td >< td class="mn31BBArrowTD" > < /td > > > /table > > > > < tr > < td onmouseover="dm.v(this,1);" onmouseout="dm.u(this);" id="mnFE0BBC45_i3" onclick="dm.ItClk(this,\'\');cmn.href(\'index.php\',\'\');" class="mn31BBMainMenuItemTD" >< table border= "0" cellspacing="0" cellpadding="0" > 746; > < td class="mn31BBTitleTD" id="mnFE0BBC45_i3-tl" >姓名

mnFE0BBC45_i3-tl 和 mnFE0BBC45_i3 并不总是相同的,数字根据 Name 而变化。

这就是我想要做的:删除所有从 Name 到第 4 次出现的 < /td >

试试这个:

算法: 1) 姓名首位; 2) 找到倒数第三个 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 >"

先看错需求;这是一个更正后的版本,它在 "Name".

之前寻找合适的匹配项

在其他出现的“<\td>”之间,我只查找字母数字字符和空格。可能需要向此字符 class 添加更多内容,例如破折号或下划线 ([[:alnum:]\ ]+)

<?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 >

编辑:

这里有一个小的 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;