Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 用于类似wiki标记的正则表达式转换_Html_Regex_Xhtml_Wiki_User Input - Fatal编程技术网

Html 用于类似wiki标记的正则表达式转换

Html 用于类似wiki标记的正则表达式转换,html,regex,xhtml,wiki,user-input,Html,Regex,Xhtml,Wiki,User Input,考虑以下加价输入: * Line 1 * Line 2 :* Line 2.1 :* Line 2.2 * Line 3 更新#1-问题稍微简单一点。巢穴的数量可以限制为三个。对于n能级深的一般解决方案仍然是很酷的 更新#2-XHTML,而不是HTML 更新#3-另一种可能的输入格式 更新#4最受欢迎的是Java解决方案(或纯正则表达式) 更新#5 修订守则: String in = " * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Li

考虑以下加价输入:

* Line 1 * Line 2 :* Line 2.1 :* Line 2.2 * Line 3 更新#1-问题稍微简单一点。巢穴的数量可以限制为三个。对于n能级深的一般解决方案仍然是很酷的

更新#2-XHTML,而不是HTML

更新#3-另一种可能的输入格式

更新#4最受欢迎的是Java解决方案(或纯正则表达式)

更新#5

修订守则:

String in = " * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3";

String sub = "<ul>" + in.replace( " > ", "<ul>" ) + "</ul>";

sub = sub.replace( " < ", "</ul>" );

sub = sub.replaceAll( "( | >)\\* ([^*<>]*)", "<li>$2</li>" );

System.out.println( "Result: " + sub );
String in=“*第1行*第2行>*第2.1行*第2.2行<*第3行”;
字符串sub=“
    ”+in.replace(“>”,“
      ”)+“
    ”; sub=sub.替换(“<”,“
”); sub=sub.replaceAll(“(|>)\\*([^*]*)”,“
  • $2
  • ”; System.out.println(“结果:+sub”);
    打印以下内容:

    Result: <ul><li>Line 1 </li>* Line 2<ul>* Line 2.1<li>Line 2.2</li></ul>* Line 3
    
    结果:
    • 第1行
    • *第2行
    *第2.1行第2.2行*第3行

    我觉得你的例子很好

     > Line 1 > Line 2 >> Line 2.1 >> Line 2.2 > Line 3
    
    不幸的是,纯正则表达式无法跟踪您所处的嵌套级别,因此它不知道将/ULclose标记放在哪里

    类似的方法可能会奏效:

     * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3
    
    *第1行*第2行>*第2.1行*第2.2行<*第3行
    
    在这里,“大于”和“小于”在层次结构中上下移动,星号是项目符号的分隔符。每个字符前后的空格都用作一种转义序列,因此,如果这些字符不被空格包围,您仍然可以按字面意思使用这些字符,或者用于其他用途,如斜体和粗体

    对RegEx的攻击:

     string ol = "<ul>" & RegEx.Replace(t, " > ", "<ul>") & "</ul>";
     ol = RegEx.Replace(ol, " < ", "</ul>");
     ol = RegEx.Replace(ol, "( |>)\\* ([^*<>]*)", "<li>\\2</li>"); 
    
    string ol=“
      ”&RegEx.Replace(t,“>”,“
        ”)&“
      ”; ol=RegEx.Replace(ol,“<”,“
    ”; ol=RegEx.Replace(ol,“(|>)\\*([^*]*)”,“
  • \\2
  • ”;
    编辑:根据下面的评论,调整以生成XHTML,关闭LI标记。还修复了我的C#语法


    最终编辑:我认为上一次替换中的\*和\2需要转义为C#,修复。另外,请注意,前两个Replace()调用可以使用String.Replace()而不是RegEx,这可能会更快。

    我觉得您的示例不错

     > Line 1 > Line 2 >> Line 2.1 >> Line 2.2 > Line 3
    
    不幸的是,纯正则表达式无法跟踪您所处的嵌套级别,因此它不知道将/ULclose标记放在哪里

    类似的方法可能会奏效:

     * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3
    
    *第1行*第2行>*第2.1行*第2.2行<*第3行
    
    在这里,“大于”和“小于”在层次结构中上下移动,星号是项目符号的分隔符。每个字符前后的空格都用作一种转义序列,因此,如果这些字符不被空格包围,您仍然可以按字面意思使用这些字符,或者用于其他用途,如斜体和粗体

    对RegEx的攻击:

     string ol = "<ul>" & RegEx.Replace(t, " > ", "<ul>") & "</ul>";
     ol = RegEx.Replace(ol, " < ", "</ul>");
     ol = RegEx.Replace(ol, "( |>)\\* ([^*<>]*)", "<li>\\2</li>"); 
    
    string ol=“
      ”&RegEx.Replace(t,“>”,“
        ”)&“
      ”; ol=RegEx.Replace(ol,“<”,“
    ”; ol=RegEx.Replace(ol,“(|>)\\*([^*]*)”,“
  • \\2
  • ”;
    编辑:根据下面的评论,调整以生成XHTML,关闭LI标记。还修复了我的C#语法


    最终编辑:我认为上一次替换中的\*和\2需要转义为C#,修复。另外,请注意,前两个Replace()调用可以使用String.Replace()而不是RegEx,这可能会更快。

    我不建议使用正则表达式作为解析和转换工具。正则表达式往往有很高的开销,并且不是解析语言的最有效的方法……这正是您真正要求它做的。您已经创建了一种语言,尽管它很简单,您应该这样对待它。我建议为您的WIKI样式的格式化代码编写一个实际的、专用的解析器。因为您可以将解析器专门针对您的语言,所以它应该更有效。此外,您不必创建一些可怕的怪物,即正则表达式来解析您的语言并处理其所有细微差别。从长远来看,您将获得更清晰的代码、更好的可维护性等好处

    我建议提供以下资源:


    我不建议使用正则表达式作为解析和转换工具。正则表达式往往有很高的开销,并且不是解析语言的最有效的方法……这正是您真正要求它做的。您已经创建了一种语言,尽管它很简单,您应该这样对待它。我建议为您的WIKI样式的格式化代码编写一个实际的、专用的解析器。因为您可以将解析器专门针对您的语言,所以它应该更有效。此外,您不必创建一些可怕的怪物,即正则表达式来解析您的语言并处理其所有细微差别。从长远来看,您将获得更清晰的代码、更好的可维护性等好处

    我建议提供以下资源:


      • 解决方案

        工作解决办法如下:

        public class Test {
          public Test() {
          }
        
          public static void main( String[] args ) {
            String in = "= Line 1 = Line 2 > = Line 2.1 = Line 2.2 < = Line 3";
        
            in = in.replaceAll( "= ([^=<>]*)", "<li>$1</li>" );
            in = in.replace( ">> ", "><ul>" );
            in = in.replace( ">< ", "></ul>" );
            in = "<ul>" + in + "</ul>";
            System.out.println( in );
          }
        }
        
        公共类测试{
        公开考试(){
        }
        公共静态void main(字符串[]args){
        字符串in=“=第1行=第2行>=第2.1行=第2.2行<=第3行”;
        in=in.replaceAll(“=([^=]*)”,“
      • $1
      • ”; in=in.替换(“>>”,“>
          ”); in=in.替换(“><”,“>
        ”); in=“
          ”+in+”
        ”; 系统输出打印项次(输入); } }
        这将创建所需的XHTML片段:

        <ul><li>Line 1 </li><li>Line 2 </li><ul><li>Line 2.1 </li><li>Line 2.2 </li></ul><li>Line 3</li></ul>
        
        • 第1行
        • 第2行
          • 第2.1行
          • 第2.2行
            • 第3行

        解决方案

        工作解决办法如下:

        public class Test {
          public Test() {
          }
        
          public static void main( String[] args ) {
            String in = "= Line 1 = Line 2 > = Line 2.1 = Line 2.2 < = Line 3";
        
            in = in.replaceAll( "= ([^=<>]*)", "<li>$1</li>" );
            in = in.replace( ">> ", "><ul>" );
            in = in.replace( ">< ", "></ul>" );
            in = "<ul>" + in + "</ul>";
            System.out.println( in );
          }
        }
        
        公共类测试{
        公开考试(){
        }
        公共静态void main(字符串[]args){
        字符串in=“=第1行=第2行>=第2.1行=第2.2行<=第3行”;
        in=in.replaceAll(“=([^=]*)”,“
      • $1
      • ”; in=in.替换(“>>”,“>
          ”); in=in.替换(“><”,“>
        ”); in=“
          ”+in+”
        ”; 系统输出打印项次(输入); } }