提取和合并不同位置之间的字符串

Extract and merge strings between different positions

我正在努力让它发挥作用。我想在给定位置之间替换句子的某些部分,然后显示带有更改的完整句子。使用以下代码,我可以进行更改,但我不知道如何将句子的其余部分放在一起。

我有两个数组,一个是女性名字出现的位置,另一个是男性名字。当女人在间隔之间的男人之前时,代码将代词 "his" 替换为 "her"。我需要做的最后一件事是用所做的更改重建句子,但我不知道如何提取句子的其余部分(结果,在示例中,是从位置 0 到 20(Maria her dress but)和 36到 51(Lorena 她的狗),但我需要从 20 到 36(Peter his jeans)和 51 到最后(Juan his car)提取以将它们合并到它们的位置。

结果应该是:"Maria her dress but Peter his jeans Lorena her dog Juan his car"。我将不胜感激,我一直在寻找其他类似的问题,但一无所获。

<?php

$womenpos  = array("0","36"); //these arrays are just examples of positions
$menpos    = array("20","51"); //they will change depending on the sentence
$sentence  = "Maria his dress but Peter his jeans Lorena his dog Juan his car";

echo $sentence."\n";      


foreach ($womenpos as $index => $value) {
    $value2 = $menpos[$index];      

    if($value < $value2) {
        echo "\nWoman(" . $value . ") is before man(" . $value2 . ")\n";
        $end = ($value2 - $value);
        $improved = str_replace(' his ', ' her ', 
                         substr($sentence, $value, $end));                           

        echo $improved."\n";                 

    } else {
        $improved = "Nothing changed";
     echo $improved;
    }     

}

这对问题的处理方式不同,但我想知道它是否会提供您正在寻找的解决方案:

$sentence  = "Maria his dress but Peter his jeans Lorena his dog Juan his car";

$women = array ("Maria", "Lorena");

$words = explode (" ", $sentence);

for ($i=0; $i< sizeof($words); $i++) {
    if ($words[$i] == "his" && in_array($words[$i-1], $women)) {
        $words[$i] = "her";
    }
}

print (join(" ", $words));

这会逐字逐句;如果前面的单词在 $women 数组中,而当前单词是 "his",它会将单词更改为 "her"。然后它按顺序吐出所有的单词。

这是否满足您的需求,还是您真的想要一个复杂的字符串定位答案?

好的,这个怎么样:

$womenpos  = array("0","36");
$menpos    = array("20","51");
$bothpos   = array_merge($womenpos,$menpos);
sort ($bothpos);
print_r($bothpos);

$sentence  = "Maria his dress but Peter his jeans Lorena his dog Juan his car";

echo $sentence."\n";      

for ($i = 0; $i<sizeof($bothpos); $i++) {
    $start = $bothpos[$i];
    if ($i ==sizeof($bothpos)-1) {
        $end = strlen($sentence);
    }
    else {
        $end = $bothpos[$i+1];
    }
    $length = $end-$start;
    $segment = substr($sentence, $start, $length);
    if (in_array($start, $womenpos)) {
        $new_segment = str_replace (' his ', ' her ', $segment);
    }
    else { $new_segment = $segment; }
    $improved .= $new_segment; 
    print "<li>$start-$end: $segment :  $new_segment </li>\n";
}

print "<p>Improved: $improved</p>";

这结合了男性和女性的位置数组,将每一段文本都视为可能有错误的文本。如果那段文本从 womenpos 点之一开始,那么它将 'his' 更改为 'her'。如果不是,它就不管它了。

这是否让您朝着想要的方向前进?希望如此!