我有一个这样的字符串:
'梨和橘子很好吃。你更倾向哪个?梨还是橘子?'
我需要在末尾替换'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以尝试一次性替换所有字符串,但这不起作用,因为原始字符串不是数组格式,它只是一个普通的字符串。
有没有人对我有任何想法或指示?当我把头发拉出来时,任何帮助都会非常受欢迎。看起来很简单,但我无法理解!
非常感谢,
约翰
答案 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');