通过PHP preg_match匹配多行模式

Dmi*_*nin 29 regex preg-match

如何通过此HTML代码中的PHP preg_match正则表达式模式匹配主题:

      <table border=0>
  <tr>
  <td>


  <h2>subject</h2>



    </td>
Run Code Online (Sandbox Code Playgroud)

所有的空格和换行都是故意留下的.所以问题是使用一些多线模式提取主题名称?

mat*_*fee 58

如果你正在寻找(例如)h2嵌套td标签中的标签,其中两者之间只有空格,只需使用\s包含空格,换行符等的标签,例如::

preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches);
// result is in $matches[1]
Run Code Online (Sandbox Code Playgroud)

这里看到它.

为了您的兴趣,这里列出了您可以传递给preg_*函数的不同修饰符.您可能感兴趣的标志是:

  • s("dotall"):这个.匹配每个角色,包括换行符.所以,说你的<h2>.....</h2>分布在多条线上.然后你必须这样做

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches);
    
    Run Code Online (Sandbox Code Playgroud)

    为了.*超越多行(请参阅s正则表达式末尾的额外内容?).

  • m("多"):这一个只是让^$比赛的开始/结束线,而不是仅仅的开始/结束的字符串.你,如果你只使用真的需要它^,并$在你的模式,并希望他们在您输入的每根线的开始/结束匹配.

  • 男人......我被困了1.5小时,直到找到你的帖子.谢谢!"s"属性是我正在寻找的. (3认同)

Sau*_*nez 13

您可以将m运算符添加到正则表达式:

// Given your HTML content.
$html = 'Your HTML content';
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches);
Run Code Online (Sandbox Code Playgroud)

哈希,希望这(仍然)有所帮助.

  • 我认为`s`修饰符(用于"DOTALL"或"单行"模式)正是你所想的,而且已经[建议](http://stackoverflow.com/a/8959000/20938) . (6认同)
  • 这种哈哈哈非常令人不安。 (3认同)
  • 如果需要,请尝试在“m”之外添加“sU” (2认同)

Bor*_*din 3

非常简单地与

preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches);
print($matches[1]);
Run Code Online (Sandbox Code Playgroud)

多行格式对正则表达式没有影响,除非您需要匹配跨多行的字符串。