react-native - 将 react-native 中的多个 html-tags 替换为 Text
问题描述
我有一个包含多个字符串的 JSON 文件,例如,每个字符串通常包含一个 a-tag。我设法替换了最后一个 A 标记,但我需要能够在字符串中进行更改。
我的地图功能如下所示:
<Text style={styles.text}>
{this.state.selectedData.map((item) =>(
<Text style={{width:ScreenWidth}}>{this.rerenderHTML(item)}</Text>
))}
</Text>
我的功能如下所示:
rerenderHTML(item){
if (item.indexOf('<i>') > -1)
{
var newItem = item.substring(
item.lastIndexOf("<i>") + 3,
item.lastIndexOf("</i>")
);
console.log("italic:"+newItem)
var itemItalic = <Text style={{fontStyle:'italic'}}>{newItem}{"\n"}{"\n"}</Text>
return itemItalic
}else if(item.indexOf('<a') > -1){
var newItem = item.substring(
item.lastIndexOf('href="') + 6,
item.lastIndexOf('"')-16
);
var firstTillSplit= item.split("<a");
var afterSplit= item.split("</a>");
var itemItalic = <Text> {firstTillSplit[0]} <Text style={{color:'red'}} onPress={()=>{Linking.openURL('http://plaatsengids.nl'+newItem)}}>{newItem.replace("/",'')}</Text> {afterSplit[1]} </Text>
var replaceLink = item.replace(/<a[^>]*>|<\/a>/g, "link"); // a try for deleting the a-tag but does only remove the HTML not the text and can't replace with component
return itemItalic
}else{
return <Text>{item}</Text>;
}
}
Json 文件如下所示:
"text": [
"Buurtschap 't Heeske valt, ook voor de postadressen, onder het dorp <a href=\"/maasbree\" target=\"_blank\">Maasbree</a> <a href=\"/test2\" target=\"_blank\">test 2</a>.",
"Maalbeek is een buurtschap in de provincie Limburg, in de streek Noord-Limburg, gemeente Venlo. T/m 2000 gemeente Belfeld.",
"De buurtschap Maalbeek valt, ook voor de postadressen, onder het dorp Belfeld.",
"De buurtschap heeft geen plaatsnaamborden en wordt ook niet in atlassen of plaatsenlijsten vermeld, maar is nog wel degelijk een buurtschap (zo is ons door inwoners uit de regio gemeld) en dus plaats(naam).",
]
结果是最后一个 a-tag 放置在第一位,因此“test2”和最后一个 A-tag 仍然可见。在这个例子中,必须首先出现“Maasbree”,然后是“test2”
我知道可以使用 A 标记打开 web 视图,但这在我的项目中是不可能的。
解决方案
您可能需要一些正则表达式来完成工作。以下是您可以搜索/替换/操作该文本的一些方法的示例:
const str = "Buurtschap 't Heeske valt, ook voor de postadressen, onder het dorp <a href=\"/maasbree\" target=\"_blank\">Maasbree</a> <a href=\"/test2\" target=\"_blank\">test 2</a>.";
const regex = RegExp(/<a\s+([^>]*)href="([^"]*)".*?>(.*?)<\/a>/gm);
console.log(Array.from(str.matchAll(regex)))
console.log(str.replace(/<a\s+([^>]*)href="([^"]*)".*?>(.*?)<\/a>/gm, "$1 Link $2"));
console.log(str.replace(/<a\s+([^>]*)href="([^"]*)".*?>(.*?)<\/a>/gm, "LINK"));
产生:
[['<a href=\'/maasbree\' target=\'_blank\'>Maasbree</a>','','/maasbree','Maasbree'],['<a href=\'/test2\' target=\'_blank\'>test 2</a>','','/test2','test 2']]
"Buurtschap 't Heeske valt, ook voor de postadressen, onder het dorp Link /maasbree Link /test2."
"Buurtschap 't Heeske valt, ook voor de postadressen, onder het dorp LINK LINK."
我使用的正则表达式是对这些答案的修改:Regular expression for anchor tag with all attributes
然后,我用它做一些事情:
- 如果您需要捕获链接或文本,我会向您展示使用的结果
matchAll
- 我向您展示了不同捕获组($1 和 $2)的替换
- 我展示了用这个词替换整个事情
LINK
。
希望这些可以让您开始以您需要的方式处理文本。
更新以获取您在比赛中寻找的特定条款:
const matches = Array.from(str.matchAll(regex))
const firstLinkHref = matches[0][2]; // == /maasbree
const firstLinkText = matches[0][3]; // == Maasbree
推荐阅读
- android - 视图未占用全宽 - ConstraintLayout - RecyclerView - Android
- javascript - 如何将传递函数作为道具发送给子组件
- python - Discord.py 加载 json 数据
- image - 在 Flutter 中使旋转后的图像适合屏幕
- sql - 所有列上的like子句
- amazon-web-services - NGNIX redirect_uri 与 AWS Cognito
- r - R中行的条件切片
- angular - Angular Firebase 应用程序成功托管在 Google Cloud Platform 中。但是该网站给出了错误
- postgresql - 无法通过主机名连接到 RDS
- jmeter - 在 Pega 应用程序的 jmeter 脚本中出现此错误“不允许此操作,因为它在当前事务之外”