通过PHP preg_match匹配多行模式

时间:2012-01-22 01:45:45

标签: regex preg-match

如何在此HTML代码中通过PHP preg_match正则表达式模式匹配 subject

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


  <h2>subject</h2>



    </td>

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

6 个答案:

答案 0 :(得分:54)

如果您正在寻找(例如)h2标记嵌套在 td标记内的,其中两者之间只有空格,只需使用{{1}其中包括空格,换行符等,例如::

\s

在行动here中查看。

为了您的兴趣,here是您可以传递给preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches); // result is in $matches[1] 函数的不同修饰符的列表。您可能感兴趣的标志是:

  • preg_*(“dotall”):这个s匹配每个字符,包括换行符。所以,说你的.分布在多行上。然后你必须做

    <h2>.....</h2>

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches); 遍历多行(请参阅正则表达式末尾的额外.*)。

  • s(“multiline”):这个只允许m^匹配的开头/结尾而不仅仅是开头/结尾字符串。如果您在模式中使用$^并希望它们与输入中每条单独行的开头/结尾相匹配,那么您才真正需要它。

答案 1 :(得分:13)

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

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

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

答案 2 :(得分:3)

非常简单

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

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

答案 3 :(得分:1)

你不应该使用正则表达式来解析html。如果您无法控制用户可以输入的内容,则可能会导致很多问题。每种语言都有很多更好的解决方案。在大多数情况下,XML解析器做得更好。查看DOMDocumentsimplehtmldomphp-html-parser

在此处查看更多答案为什么您不应该在html上使用正则表达式: RegEx match open tags except XHTML self-contained tags

答案 4 :(得分:0)

捕获由4个四个反引号分隔的代码块(作为markdown语法)。

示例易于修改。

<?php

$str = '
# Some Text

```` 
    h5 {
      font-size: 1rem;
      font-weight: 600;
    }
````

And some text.
';

$reg = '/````[^>]*(.*?)````/';

preg_match($reg, $str, $matches);
echo $matches[0];

/* OUTPUT
```` 
    h5 {
      font-size: 1rem;
      font-weight: 600;
    }
````
*/

echo preg_replace($reg, "DELETED", $str);

/* OUTPUT
# Some Text

DELETED

And some text.
*/

答案 5 :(得分:-4)

您必须使用正则表达式中的\s删除所有换行符。

$str ="<ol>
        <li>Capable for unlimited product</li>
        <li>Two currency support</li>
        <li>Works with touch screens and click screen based systems</li>
        <li>Responsive design <b>shopping cart</b>, Specially design for Mac, iPhone, iPad, PC and Android</li>
        <li>VAT for countries that support a Value Added Tax</li>
        <li>Barcode scanner checkout option for POS</li>
        <li>mRSS</li>
      </ol>";

preg_match("/^([A-Za-z0-9\s\<\>\.\,\/\-\ ]+)$/",$str);

//Sanitize your code before save to database.

function test_input($data) {
$data = trim($data);
$data = htmlspecialchars($data);
$data = json_encode($data);
$data = addslashes($data);
return $data;
}

echo test_input($str);