PHP使用偏移量和长度来替换多个字符串

时间:2014-03-10 23:02:57

标签: php string

我有一个这样的字符串:

'梨和橘子很好吃。你更倾向哪个?梨还是橘子?'

我需要在末尾替换'Pear'和'Orange'字符串并将它们包裹在链接中。我有以下JSON格式的信息:

"string": "The Pear and Orange are tasty. Which one do you prefer? Pear or Orange?",
"links": {
"55": [
   {
      "url": "http://example.com/pear",
      "name": "Pear",
      "offset": 55,
      "length": 4
   }
],
"63": [
   {
      "url": "http://example.com/orange",
      "name": "Orange",
      "offset": 63,
      "length": 6
   }
]

我想使用offset和length来替换字符串而不是依赖于名称,因为主字符串可能包含多次出现的单词。

我尝试了什么:

1)我尝试使用foreach循环遍历JSON中的链接并使用substr_replace替换它们,但是在第一个循环之后,偏移量不准确,因为我用链接替换了第一个字符串,将原始字符串的长度增加20-30个字符。

2)然后我尝试将replace,offset和length数组传递给substr_replace以尝试一次性替换所有字符串,但这不起作用,因为原始字符串不是数组格式,它只是一个普通的字符串。

有没有人对我有任何想法或指示?当我把头发拉出来时,任何帮助都会非常受欢迎。看起来很简单,但我无法理解!

非常感谢,

约翰

1 个答案:

答案 0 :(得分:2)

你的第一直觉是对的。您需要做的唯一更改是使for循环以 last 条目开始并向后循环,而不是相反。这将起作用,因为只有在字符串中的之前 时,单词的偏移量才会发生变化。

for($i = count($links)-1; $i >= 0; $i--) {
    str_replace( ... );
}

上述方法要求链接根据其偏移量进行排序,但最高偏移量在阵列中排在最后。如果链接未排序,则必须先执行此操作。但是如果你需要对数组进行排序,你也可以对它们进行排序,使得最高的偏移量首先出现并以正常的方式循环遍历数组。

例如:

$links = array(
    array( 'name' => 'Pear', 'offset' => 55 ),
    array( 'name' => 'Orange', 'offset' => 63 ),
    array( 'name' => 'LAST', 'offset' => 0 ),
    array( 'name' => 'MIDDLE', 'offset' => 60 ),
    array( 'name' => 'FIRST', 'offset' => 1000)
);

function mySort($a, $b) {
    return $b['offset'] - $a['offset']; // Sorts elements with higher offset first
}

usort($links, 'mySort');