【问题标题】:Valid Regex Not so valid in PHP [duplicate]有效的正则表达式在 PHP 中不太有效 [重复]
【发布时间】:2017-08-03 19:45:58
【问题描述】:

所以我想提取表单标签之间的所有内容(包括它们本身的标签)。

表格如下:

<body><br />
    <!-- 
<form method="POST" action="#">
<table style="table-layout: fixed; border: 1px solid #ffffff; " border="1">
            <!-- 
<col width="50"> --></p>
<tr style="width: 1154px; background-color: #0d56c2; vertical-align: middle; color: #ffffff; height: 70px; ">
<td style="width: 413px; text-align: center;">Calls</td>
<td style="background-color: #D6DCE5; width: 319px; padding-left: 20px; padding-top: 15px;"><input type="text" name="calls" value="150" style="width: 173px;"></td>
<td style="width: 412px; padding: 5px; vertical-align: middle;"> in a period of <input name="period" value="5" style="width: 173px; ">&nbsp;<br />
                    <select name="callUnit" style="width: 100px; height: 29px; position: absolute;"><option value="hour" selected>hours</option><option value="minute" >minutes</option></select>
                </td>
</tr>
</table>
</form>
</body>

我正在使用的正则表达式是:&lt;form.*&gt;[\s\S]*&lt;\/form&gt; 并根据regex101 这是一个有效的正则表达式,应该提取表单标签+介于两者之间的所有内容。

但是在 preg_match 中使用上述正则表达式我得到以下错误:Warning: preg_match(): Unknown modifier '['

【问题讨论】:

  • 正则表达式并不是处理 html 解析的最佳工具。您是否考虑过为此使用 DOM 解析器?
  • 对我们来说,能够帮助解决我们真正需要您使用的 php 代码行的具体问题...

标签: php regex validation


【解决方案1】:

不确定您的实际问题是什么。对我来说,你的模式就像魅力:

<?php
$markup = <<<HTML
<body><br />
    <!--
<form method="POST" action="#">
<table style="table-layout: fixed; border: 1px solid #ffffff; " border="1">
            <!--
<col width="50"> --></p>
<tr style="width: 1154px; background-color: #0d56c2; vertical-align: middle; color: #ffffff; height: 70px; ">
<td style="width: 413px; text-align: center;">Calls</td>
<td style="background-color: #D6DCE5; width: 319px; padding-left: 20px; padding-top: 15px;"><input type="text" name="calls" value="150" style="width: 173px;"></td>
<td style="width: 412px; padding: 5px; vertical-align: middle;"> in a period of <input name="period" value="5" style="width: 173px; ">&nbsp;<br />
                    <select name="callUnit" style="width: 100px; height: 29px; position: absolute;"><option value="hour" selected>hours</option><option value="minute" >minutes</option></select>
                </td>
</tr>
</table>
</form>
</body>
HTML;

preg_match('~<form.*>([\s\S]*)</form>~', $markup, $tokens);
var_dump($tokens[1]);

它的输出是:

string(829) "
<table style="table-layout: fixed; border: 1px solid #ffffff; " border="1">
            <!--
<col width="50"> --></p>
<tr style="width: 1154px; background-color: #0d56c2; vertical-align: middle; color: #ffffff; height: 70px; ">
<td style="width: 413px; text-align: center;">Calls</td>
<td style="background-color: #D6DCE5; width: 319px; padding-left: 20px; padding-top: 15px;"><input type="text" name="calls" value="150" style="width: 173px;"></td>
<td style="width: 412px; padding: 5px; vertical-align: middle;"> in a period of <input name="period" value="5" style="width: 173px; ">&nbsp;<br />
                    <select name="callUnit" style="width: 100px; height: 29px; position: absolute;"><option value="hour" selected>hours</option><option value="minute" >minutes</option></select>
                </td>
</tr>
</table>
"

我所做的唯一修改是添加捕获组 ((...)) 以便能够实际提取某些内容。

您正在使用反斜杠转义结束 &lt;/form&gt; 标记中的正斜杠。这很可能是因为像regex101 这样的在线正则表达式工具在其模式中使用正斜杠作为标准分隔符。请注意,您可以使用使模式更易于阅读的其他字符,因为您确实 不必 必须转义字符然后...


怀疑您可能忘记将您的模式放在分隔符之间?

【讨论】:

  • 是的,它的分隔符......现在它工作得很好:) - 我想知道为什么/谁投反对票......
  • @MaciejCygan 不能说你为什么会收到反对票。忽略它,不值得为此浪费时间。 可能有人想表达您应该更仔细地阅读文档,因为其中提到了分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多