<h3 class='ql-align-right'><strong style='color: rgb(255, 153, 0);'><em><u>你好嗎</u></em></strong></h3>
需求是這樣的, 這個html字符串會轉(zhuǎn)換成一個原生輸入框,里面文字是可以替換的缔俄。 html的標簽映射成原生android 的屬性, 輸入框里面是“ 你好嗎” 三個字笛质。如果更改了 你好嗎 這三個字后需要替換整個帶標簽的字符串洞斯。
問題來了 如果我用 replaceAll 將你好嗎替換成我想要輸入的文字, 沒問題她混。 但是如果輸入的是u呢 或者是255 152 0 這些是在標簽里面就帶有的數(shù)據(jù)呢? 那很明顯直接全部替換是不能行的饲漾。
那我的思路是 找錨點一起替換 html 標簽它是一一對應(yīng)關(guān)系的珍剑,所以我通過正則找到最里層的一個標簽組 <u>xxx</u>
贫堰,表達式為<.>.*?</.>
穆壕, 然后再將 u 標簽里面的內(nèi)容替換成自己想變成的數(shù)據(jù) 通過u標簽的 > <錨點來進行, 這個肯定能將數(shù)據(jù)找到并替換 replaceAll(RegExp(">.*<"), ">$updateText<")
那么u標簽里面內(nèi)容就變成了 <u>刷新過的數(shù)據(jù)了</u>
然后再對完整的字符串進行替換。
String _replaceHtmlBQContent(String defaultText,String updateText){
String replaceAllTxt;
if (RegExp('<[^>]+>').hasMatch(defaultText)) {
//如果要替換,必須使用這個includeBqGroup,不然可能會出現(xiàn)字符串替換到樣式里面
String includeBqGroup = RegExp('<.>.*?</.>').firstMatch(defaultText).group(0);
String value = includeBqGroup.replaceAll(RegExp(">.*<"), ">$updateText<");
replaceAllTxt = defaultText.replaceAll(includeBqGroup, value);
} else {
replaceAllTxt = defaultText;
}
return replaceAllTxt;
}
還有另一個辦法, 貌似更好用 因為標簽都是對稱的, 所以將標簽個數(shù) /2 得到中間標簽
String htmlData = "<h3 class='ql-align-right'><strong style='color: rgb(255, 153, 0);'><em><u></u></em></strong></h3>";
String tihuanzhi = "你好嗎";
List<RegExpMatch> allMatch = RegExp('<[^>]+>').allMatches(htmlData).toList();
int position = allMatch.length ~/ 2.toInt();
RegExpMatch endMatch = allMatch[position - 1];
print('結(jié)束位置 ${endMatch.end}');
RegExpMatch startMatch = allMatch[position];
print('開始位置 ${startMatch.start}');
String content = htmlData.replaceRange(endMatch.end,startMatch.start, tihuanzhi);
print('$content');
看這個正則
https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
<[^>]+>
[^] 表示字符串里面不包含的
< 表示開始是 這個尖括號
<[^>] 表示找到所有 < 開頭但是不包含> 的字符串
- 匹配前面的子表達式一次或多次其屏。例如喇勋,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”偎行。+等價于{1,}川背。
結(jié)尾字符
所以加在一起就是 <[^>]+ 用<開頭 碰到>就結(jié)束, 然后末尾加 > 就可以去掉所有html標簽了
"<p class="ql-align-center">姓名: 代瑤</p>"
group 1 是第一個括號里面的值 例如 RegExp('class="([^"]+)"').firstMatch(htmlData);