我有一个 RTE 文本,格式如下:
<li> text </li>
<li> text </li>
<p> text </p>
<p> text </p>
<li> text </li>
<li> text </li>
这里的问题是,“li”标签没有包含在“ul”标签中。因为我正在编写迁移脚本,所以我想使用 Java 来实现这一点。我在 Jquery 中找到了答案,但在 Java 中很难找到这样的解决方案。
注意:不确定是否重要,但这是客户在 Excel 工作表中为迁移提供的 RTE 文本。
上面文本的期望结果如下:
<ul>
<li> text </li>
<li> text </li>
</ul>
<p> text </p>
<p> text </p>
<ul>
<li> text </li>
<li> text </li>
</ul>
最佳答案
如果您只是将其作为字符串取回,这里有一个正则表达式解决方案,它应该可以工作,或者至少可以作为一个很好的起点。
String pattern1 = "(?<!</li>\\s{0,100})(<li>)";
String replace1 = "<ul><li>";
String pattern2 = "</li>(?!\\s{0,100}<li>)";
String replace2 = "</li></ul>";
模式寻找<li>
前面没有 </li>
的标签标签(忽略它们之间的任何空白)然后用一个空缺 <ul><li>
替换它们标签。
然后它会寻找任何 </li>
后面没有 <li>
的标签标记并替换为 </li></ul>
标签
完整代码如下,或 here是一个活生生的例子
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String input = "<li> text </li> <li> text </li> <p> text </p> <p> text </p><li> text<span>more test</span> </li><li> text </li>";
String pattern1 = "(?<!</li>\\s{0,100})(<li>)";
String replace1 = "<ul><li>";
String pattern2 = "</li>(?!\\s{0,100}<li>)";
String replace2 = "</li></ul>";
// Create a Pattern object
Pattern r1 = Pattern.compile(pattern1);
Pattern r2 = Pattern.compile(pattern2);
// Now create matcher object.
Matcher m1 = r1.matcher(input);
input = m1.replaceAll(replace1);
Matcher m2 = r2.matcher(input);
input = m2.replaceAll(replace2);
System.out.println(input);
}
}
关于java - 在 RTE 文本中用 <ul> 标签包裹 <li> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680467/