【问题标题】:Matching a multiple lines pattern via PHP's preg_match()通过 PHP 的 preg_match() 匹配多行模式
【发布时间】:2012-02-16 00:23:09
【问题描述】:

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

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


  <h2>subject</h2>



    </td>

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

【问题讨论】:

标签: regex preg-match


【解决方案1】:

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

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

看到它在行动here

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

  • s ("dotall") :这个使. 匹配每个字符,包括换行符。因此,假设您的 &lt;h2&gt;.....&lt;/h2&gt; 分布在多行中。那你就必须这样做

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

    为了让.* 遍历多行(请参阅正则表达式末尾的额外s?)。

  • m ("multiline") :这个只是让^$ 匹配line 的开始/结束,而不仅仅是string 的开始/结束。只有当您在模式中使用 ^$ 并希望它们匹配输入中每一行的开始/结束时,您才真正需要它。

【讨论】:

  • 伙计...我被困了 1.5 小时,直到找到你的帖子。谢谢! “s”属性是我要找的。​​span>
  • 我想匹配多行输入中特定行的开头,所以'/^start/im'
【解决方案2】:

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

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

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

【讨论】:

  • 我认为s 修饰符(用于“DOTALL”或“单行”模式)是您所想的,而这已经是suggested
  • 这个哈哈哈很烦。
  • 如果需要,除了“m”之外,还可以尝试添加“sU”
【解决方案3】:

很简单

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

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

【讨论】:

  • 对不起,我应该更具体。问题在于我正在处理的 HTML 代码中缺少“标识符”。可能还有其他一些 h2 标签和其他标签。所以我试图使用周围的标签来准确定位代码中的这个特定位置。那么我怎样才能让正则表达式模式理解多行呢?...
【解决方案4】:

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

请参阅此处了解为什么不应该在 HTML 内容上使用正则表达式的更多答案: RegEx match open tags except XHTML self-contained tags

【讨论】:

  • 我正在寻找这个答案。我很惊讶 5 年后没有人建议用正则表达式解析 html 可能是个坏主意。不明白为什么它被否决。
  • 是的,欢迎来到俱乐部。不过,我仍然坚持我的答案:)
  • 这绝对是解决这个问题的方法。至少给它另一个赞成票:-)
  • 我没有对此投票,但我可能会补充一点,它错过了问题的重点,即如何将preg_match 与多行一起使用。如果您不喜欢该用例,则回答问题。
  • 嗯。我认为我提供的解决方案比提供的解决方案更好。如果有人使用了错误的工具,我不应该告诉他们他们这样做并提供更好的选择吗?
【解决方案5】:

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

易于适应的示例。

<?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.
*/

【讨论】:

  • 你在回答什么问题?
  • 通过 PHP 的 preg_match() 匹配多行模式
【解决方案6】:

您必须在正则表达式中使用\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);

【讨论】:

  • 我想他想保留新的台词
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多