2017-08-03 68 views
-2

所以我想提取表單標籤(包括它們自己的標籤)之間的所有內容。有效的正則表達式在PHP中不是那麼有效

形式爲如下:

<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> 

正則表達式我使用的是:<form.*>[\s\S]*<\/form>和根據regex101這是一個有效的正則表達式應該提取形式標籤之間+一切。

但是使用的preg_match上述正則表達式我得到以下錯誤:Warning: preg_match(): Unknown modifier '['

+1

http://php.net/manual/en/regexp.reference.delimiters.php –

+0

正則表達式並不完全是處理html解析的最佳實用工具。你有沒有想過使用DOM解析器? – arkascha

+0

對於我們來說,能夠幫助您解決具體的問題,我們真的需要您使用的PHP代碼行...... – arkascha

回答

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> 
" 

我做了唯一的修改是增加了捕獲組((...)),以能夠真正提取的東西。

您正在使用反斜槓在關閉</form>標記中轉義斜線。最有可能是因爲regex101等在線正則表達工具在其模式中使用正斜槓作爲標準分隔符。請注意,您可以使用其他字符,這使得模式更易於閱讀,因爲你做有轉義字符,然後...


嫌疑你也許忘了把你的圖案之間分隔符?

+0

是它的分隔符......現在它工作得非常好:) - 我想知道爲什麼/誰降低了...... –

+0

@MaciejCygan不能說爲什麼你收到了反對票。只是忽略它,不值得浪費一點。它可能是有人想要表達的是你應該更仔細地閱讀文檔,因爲在那裏提到了分隔符。 – arkascha

相關問題