我需要找到一种方法来计算位于div-element中的文本的位置(即字符位置的索引)到HTML-Code的相应位置。这是必要的,因为我必须能够在该位置插入元素而不会丢失格式。
例如,我有以下内容:
HTML
<p>
Lorem<strong>
ipsum</strong>
dolor坐......</p>
被解释为:
文字
Lorem ipsum dolor坐......
现在我想在文本中的特定位置插入一个字符串元素:
Lorem ipsum d
<insertion>
olor sit ...
这是在字符串索引:13
关于插件的位置应该在我的 HTML 中32
,因为有HTML标签:<p>
,<strong>
,{{ 1}}必须计算在 HTML 中找到正确的位置。
我只有那些信息:
</strong>
)解决方案应该在13
。我使用Python
模块,但没有找到在元素内的特定索引处插入文本的方法。
希望有人可以帮助我。非常感谢提前!
答案 0 :(得分:3)
当我从您的问题中得到答案时,您希望在HTML代码中插入一些字母,这些字母以明文形式知道索引。如果是这种情况,我认为最简单的解决方案是忽略所有的html标签,只计算它们之外的字母。 你可以这样做:
def insertInHtml(string, insstr, position):
ctr=0
insidetag=False
for ci in range(len(string)):
if string[ci]=='<':
insidetag=True
elif string[ci]=='>':
insidetag=False
else:
if not insidetag: ctr+=1
if ctr==position+1:
HTMLIndex=ci
break
return string[0:HTMLIndex] + insstr + string[HTMLIndex:]
该函数计算传递给函数的HTML字符串中的字符数,作为不在HTML标记内的“字符串”参数。当你点击作为'position'参数传递给函数的数字时,计数循环将中断,函数将把字符串拆分到你指定位置的字母后面。然后它将在这些部分之间插入insstr字符串并返回新字符串。如果提供的索引大于文本的长度,则会引发错误。
编辑: 正如J. F. Sebastian所指出的那样,如果html有注释(以&lt ;,感叹号和两个破折号开头的行)或文字&lt;在属性中。以下是处理这两种情况的函数:
def insertInHtml(string, insstr, position):
ctr=0
insidetag=False
insideattr=False
for ci in range(len(string)):
suchar=''
if not ci==len(string)-1: suchar=string[ci+1]
if string[ci]=='<' and not insideattr:
insidetag=True
elif (string[ci]=='>' and not insideattr) or (string[ci]=='-' and string[ci-2:ci]=='!-'):
insidetag=False
elif insidetag and string[ci]+suchar=='="':
insideattr=True
elif insideattr and string[ci]=='"':
insideattr=False
else:
if not insidetag: ctr+=1
if ctr==position+1:
HTMLIndex=ci
break
return string[0:HTMLIndex] + insstr + string[HTMLIndex:]
代码不是很干净,但应该可以理解。