使用正则表达式将标记内容转换为lipsum

时间:2011-07-14 17:05:55

标签: html regex grep

我正在对一个微网站进行博客,以用作投资组合。它是用静态html构建的,我需要用lipsum甚至是乱码文本替换每个非脚本标签的内容 - 但它必须与当前文本的字符数相同才能保持格式化。此外,我真的宁愿使用GUI grep编辑器而不是编写脚本,因为可能需要一些标记来保存内容。

我使用正则表达式\>([^$]+?)\<来查找它们(所有脚本都以$开头,因此它会跳过脚本标记)但我找不到任何方法来计算匹配的字符数并用相应的数字替换嘴唇或随机字符。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我能够成功地做到这一点,尽管我不得不最终使用Java程序。结果正则表达式很好,因为我没有解析整个事情,只是几个部分。有一些怪癖,但这完成了工作。

public class Debrander {

public static void main(String[] args) {

       // reads in html from StdIn
       String htmlPage = StdIn.readAll();

       //regex matches all content within non-script non-style tags
       Pattern tagContentRegex = Pattern.compile("\\>(.*?)\\<(?!/script)(?!/style)");
       Matcher myMatcher = tagContentRegex.matcher(htmlPage);

       //different regex to check for whitespace
       Pattern whiteRegex = Pattern.compile("[^\\s]");

       StringBuffer sb = new StringBuffer();

       LoremIpsum4J loremIpsum = new LoremIpsum4J();
       loremIpsum.setStartWithLoremIpsum(false);

       //loop through all matches
       while(myMatcher.find()){
           String tagContent = htmlPage.substring(myMatcher.start(1), myMatcher.end(1));
           Matcher whiteMatcher = whiteRegex.matcher(tagContent);
           //whiteMatcher makes sure there is a NON-WHITESPACE character in the string
           if (whiteMatcher.find()){
               Integer charCount = (myMatcher.end(1) - myMatcher.start(1));

               String[] lipsum = loremIpsum.getBytes(charCount);
               String replaceString = ">";

               for (int i=0; i<lipsum.length; i++){
                   replaceString += lipsum[i];
               }
               replaceString += "<";
               myMatcher.appendReplacement(sb, replaceString);
           }
       }
       myMatcher.appendTail(sb);
       StdOut.println(sb.toString());
   }

}