Php 如何匹配一块<;李></李>;使用regexp

Php 如何匹配一块<;李></李>;使用regexp,php,regex,Php,Regex,我怎样才能配得上一块巧克力呢 <li>item 1</li> <li>item 2</li> 第1项 项目2 无论块之前或之后是否有空行 并使用PHP的preg.* 功能 感谢您的回答David已经说过,php有xml和html解析器。但是,如果您真的想使用正则表达式,它可能是这样的: preg_match('#<li>(.*?)</li>#', $string); // Same thing preg_match('#

我怎样才能配得上一块巧克力呢

<li>item 1</li>
<li>item 2</li>
  • 第1项
  • 项目2
  • 无论块之前或之后是否有空行 并使用PHP的
    preg.*
    功能


    感谢您的回答

    David已经说过,php有xml和html解析器。但是,如果您真的想使用正则表达式,它可能是这样的:

    preg_match('#<li>(.*?)</li>#', $string);
    // Same thing
    preg_match('#<li>(.*)</li>#U', $string);
    
    preg#u match('#
  • (.*)
  • #',$string); //同样的事情 preg#U match('#
  • (.*)
  • #U',$string);
    David已经说过,php有xml和html解析器。但是,如果您真的想使用正则表达式,它可能是这样的:

    preg_match('#<li>(.*?)</li>#', $string);
    // Same thing
    preg_match('#<li>(.*)</li>#U', $string);
    
    preg#u match('#
  • (.*)
  • #',$string); //同样的事情 preg#U match('#
  • (.*)
  • #U',$string);
    如果这是一种安全、受控的输入,而您刚刚得到的LIs缺少父ULs,您可以执行以下操作:

    preg_replace ( '#\s*(?:<li>.*</li>\s*)+#' , '<ul>$0</ul>', $input )
    
    preg#u replace('#\s*(?:
  • *
  • \s*)+#','
      $0
    ',$input)
    (您可能需要在UL之前或之后的替换字符串中添加一些
    \n


    注意:如果:

    • 内容中有任何现有的UL/OL列表
    • 在连续的列表项之间除了空格之外,没有其他内容
    • 任何LIs跨越多行(默认情况下,
      不包括换行符)
    • LIs上有任何属性
    • 可能有些事情我没有考虑过
    其中一些可以相对容易地得到满足,但我不打算——如果你还不知道具体的内容,你应该使用一个

    正则表达式中的“Regular”有特定的含义,而完整的HTML不是一个简单的正则表达式,因此试图用简单的正则表达式处理所有复杂的HTML很可能会失败。

    如果您在用户提供的HTML上使用了错误的正则表达式,则可能是在代码中引入了错误的正则表达式。

    如果这是安全的、受控的输入,并且您刚刚获得了缺少父ULs的LIs,您可以执行以下操作:

    preg_replace ( '#\s*(?:<li>.*</li>\s*)+#' , '<ul>$0</ul>', $input )
    
    preg#u replace('#\s*(?:
  • *
  • \s*)+#','
      $0
    ',$input)
    (您可能需要在UL之前或之后的替换字符串中添加一些
    \n


    注意:如果:

    • 内容中有任何现有的UL/OL列表
    • 在连续的列表项之间除了空格之外,没有其他内容
    • 任何LIs跨越多行(默认情况下,
      不包括换行符)
    • LIs上有任何属性
    • 可能有些事情我没有考虑过
    其中一些可以相对容易地得到满足,但我不打算——如果你还不知道具体的内容,你应该使用一个

    正则表达式中的“Regular”有特定的含义,而完整的HTML不是一个简单的正则表达式,因此试图用简单的正则表达式处理所有复杂的HTML很可能会失败。


    如果您在用户提供的HTML上使用了一个不好的正则表达式,您可能会在代码中引入它。

    PHP必须有某种XML解析器。不要再想使用正则表达式了。它们是错误的工作工具。可以使用regexp,但这不是一个好主意。XML解析器更适合解决这类问题首先:人们对询问如何使用正则表达式解析HTML感到厌烦。第二:从伦敦到爱丁堡可以蒙着眼睛跳来跳去,但这并不意味着这是个好主意。第三:我们不是已经过了指责那些说无知是坏主意的人的阶段了吗?我们能马上停止抨击这些问题吗?如果内容是众所周知的,并且OP有一个非常特殊的需求,正则表达式是非常好的。不要把答案当作是圣歌之类的链接。这是一个有效的问题:提供一个有效的答案,或者继续前进。PHP必须有某种XML解析器。不要再想使用正则表达式了。它们是错误的工作工具。可以使用regexp,但这不是一个好主意。XML解析器更适合解决这类问题首先:人们对询问如何使用正则表达式解析HTML感到厌烦。第二:从伦敦到爱丁堡可以蒙着眼睛跳来跳去,但这并不意味着这是个好主意。第三:我们不是已经过了指责那些说无知是坏主意的人的阶段了吗?我们能马上停止抨击这些问题吗?如果内容是众所周知的,并且OP有一个非常特殊的需求,正则表达式是非常好的。不要把答案当作是圣歌之类的链接。这是一个有效的问题:提供一个有效的答案或者继续。当使用
    #
    作为正则表达式边界时,您真的需要避开
    /
    吗?这一点很好。刚刚测试过,它也能正常工作,不会逃逸。我去掉了斜线。谢谢:)这只在每个
  • 都有一行代码的情况下才有效。如果一行中有多个列表元素,它将匹配整行,而不是它自身的每个元素。如果一行上有多个
  • -标记,则它不起作用。这就是为什么
    紧跟在
    *
    之后,或者在第二个版本中,我使用
    U
    -修饰符来逆转贪婪。如果你不考虑这一点,事情就会像你说的那样进行,
    item1
  • item2
  • 将是匹配的。这里的情况不是这样,每条线总是有一对锂。非常感谢faileN:)当使用
    #
    作为正则表达式边界时,您真的需要避开
    /
    吗?很好。刚刚测试过,它也能正常工作,不会逃逸。我去掉了斜线。谢谢:)这只在每个
  • 都有一行代码的情况下才有效。如果一行中有多个列表元素,它将匹配整行,而不是它自身的每个元素。如果一行上有多个
  • -标记,则它不起作用。这就是为什么
    紧跟在
    *
    之后,或者在第二个版本中,我使用
    U
    -修饰符来逆转贪婪。如果你愿意离开