-2

基本上我正在寻找的是这个线程的 PHP 版本: Find, replace, and increment at eachoccurrence of string

我想>用递增计数器替换 rach 行开头的关键字。

如果我的输入是:

>num, blah, blah, blah

ATCGACTGAATCGA

>num, blah, blah, blah

ATCGATCGATCGATCG

>num, blah, blah, blah

ATCGATCGATCGATCG

我希望它是...

>0, blah, blah, blah

ATCGACTGAATCGA

>1, blah, blah, blah

ATCGATCGATCGATCG

>2, blah, blah, blah

ATCGATCGATCGATCG
4

5 回答 5

2
$str = 'a hello a some a';
$i = 0;

while (strpos($str, 'a') !== false)
{
    $str = preg_replace('/a/', $i++, $str, 1);
}

echo $str;
于 2012-02-14T07:23:17.977 回答
1
preg_replace(array_fill(0, 5, '/'.$findme.'/'), range(1, 5), $string, 1);

例子:

preg_replace(array_fill(0, 5, '/\?/'), range(1, 5), 'a b ? c ? d ? e f g ? h ?', 1);

输出

a b 1 c 2 d 3 e f g 4 h 5
于 2014-03-25T10:18:28.897 回答
0

如果我正确理解了您的问题...

<?php
//data resides in data.txt
$file = file('data.txt');
//new data will be pushed into here.
$new = array();
//fill up the array
foreach($file as $fK =>$fV) $new[] = (substr($fV, 0, 1)==">")? str_replace("num", $fK/2, $fV) : $fV;
//optionally print it out in the browser.
echo "<pre>";
print_r($new);
echo "</pre>";
//optionally write to file...
$output = fopen("output.txt", 'w');
foreach($new as $n) fwrite($output, $n);
fclose($output);
于 2012-02-14T07:30:28.467 回答
0

我更喜欢preg_replace_callback()用于这个任务。preg_replace()这是一个比每次从字符串开头重新开始的迭代单个调用(检查已被替换的文本)更直接的解决方案。

  • ^由于m模式修饰符,表示一行的开始。
  • \K表示重新开始完整的字符串匹配。这有效地防止了文字>被替换,因此只替换了文字字符串num
  • static柜台声明只会在第一次$counter访问时设置0
  • 自定义函数不需要接收匹配的子字符串,因为要替换整个完整的字符串匹配。

代码:(演示

$text = <<<TEXT
>num, blah, blah, blah

ATCGACTGAATCGA

>num, blah, blah, blah

ATCGATCGATCGATCG

>num, blah, blah, blah

ATCGATCGATCGATCG
TEXT;

echo preg_replace_callback(
         "~^>\Knum~m",
         function () {
             static $counter = 0;
             return ++$counter;
         },
         $text
     );
于 2020-12-19T22:24:38.277 回答
-2

这是我的两分钱

function str_replace_once($correct, $wrong, $haystack) {
    $wrong_string = '/' . $wrong . '/';
    return preg_replace($wrong_string, $correct, $haystack, 1);
}

上述函数仅用于替换字符串出现一次,但您可以自由编辑该函数以执行所有其他可能的操作。

于 2012-02-14T08:23:09.133 回答