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;
我在使用 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; 这只是代码的一小部分(是一个Javascript菜单),所有标签(< tr >)中都有空格可以看到它们.... 我要删除的文字是: < /td >< td class="mn31BBArrowTD" > < /td > > mnFE0BBC45_i3-tl 和 mnFE0BBC45_i3 并不总是相同的,数字根据 Name 而变化。 这就是我想要做的:删除所有从 Name 到第 4 次出现的 < /td > 试试这个: 算法:
1) 姓名首位;
2) 找到倒数第三个 td 的位置
3) 然后从这两个位置截断或生成子字符串。 输出: 先看错需求;这是一个更正后的版本,它在 "Name". 在其他出现的“<\td>”之间,我只查找字母数字字符和空格。可能需要向此字符 class 添加更多内容,例如破折号或下划线 ([[:alnum:]\ ]+) 输出: 编辑: 这里有一个小的 Perl 脚本,可以执行您想要的操作: > /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" > < 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...
746; > < td class="mn31BBTitleTD" id="mnFE0BBC45_i3-tl" >姓名
$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 >"
<?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 >
#!/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;