在網頁開發中,常常會使用 JavaScript 來實作一些功能。而在HTML 頁面中,JavaScript 程式碼片段通常會嵌在<script>
標籤中,但有時腳本片段並沒有放在標準的<script>
標籤中,而是存在於其他HTML 元素的屬性中,如onclick
、onload
等。
如果我們想要找到 HTML 頁面中所有的 JavaScript 程式碼片段,我們可以使用 PHP 的正規表示式來匹配。
正規表示式(regular expression)是用來描述字串模式的一種語法規則。在 PHP 中,使用 /
符號將正規表示式包裹起來,如 /pattern/
,其中 pattern
表示所要匹配的模式。
常用的正規表示式元字元包括:
.
:符合任何單一字元:符合前一個字元的零個或多個實例
:符合前一個字元的一個或多個實例
:匹配前一個字元的一個或零個實例
:選擇符合字串中的其中一項
函數來符合HTML 頁面中所有的<script>
標籤: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$html = file_get_contents('example.html'); // 获取 HTML 文件内容
$pattern = "/<script(.*?)>(.*?)</script>/is"; // 匹配 script 标记的正则表达式
preg_match_all($pattern, $html, $matches); // 执行匹配</pre><div class="contentsignin">登入後複製</div></div>
上述程式碼中,我們使用
函數取得一個HTML 檔案的內容,然後使用正規表示式/<script(.*?)>(.*?)< ;/script>/is
符合HTML 頁面中所有<script>
標記的內容,並將符合的結果儲存在$matches
陣列中。 然而,這樣只是取得了包含在
標籤中的 JavaScript 程式碼,而不包括其它屬性中的程式碼。 符合屬性中的 JavaScript 程式碼
屬性中,其他事件的JavaScript 程式碼可能存在於onload
、onsubmit
、onchange
等屬性中。 我們可以使用PHP 內建的
函數來取得HTML 頁面的所有元標記,並分析其屬性,找出包含JavaScript 程式碼的屬性名稱:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$html = file_get_contents('example.html'); // 获取 HTML 文件内容
$meta_tags = get_meta_tags('data://text/html;base64,' . base64_encode($html)); // 获取元标记信息
$pattern = "/on[a-z]+=['"](.*?)['"]/i"; // 匹配属性中的 JavaScript 代码的正则表达式
$matches = array(); // 存储匹配结果
foreach($meta_tags as $tag=>$value) { // 遍历元标记
if(preg_match_all($pattern, $value, $submatches)) { // 匹配属性中的 JavaScript 代码
$matches = array_merge($matches, $submatches[1]); // 合并匹配结果
}
}</pre><div class="contentsignin">登入後複製</div></div>
上述在程式碼中,我們使用
函數來取得HTML 頁面的元標記。然後,我們使用正規表示式"/on[a-z] =['"](.*?)['"]/i"
來匹配所有屬性名稱以on
開頭的屬性,其中包含JavaScript 程式碼。最後,我們使用 preg_match_all
函數將符合的結果儲存在 $matches
陣列中。 合併所有 JavaScript 程式碼
$html = file_get_contents('example.html'); // 获取 HTML 文件内容 $script_pattern = "/<script(.*?)>(.*?)</script>/is"; $attr_pattern = "/on[a-z]+=['"](.*?)['"]/i"; preg_match_all($script_pattern, $html, $script_matches); // 匹配 script 标记中的代码 $attr_matches = array(); // 存储属性中的代码 $meta_tags = get_meta_tags('data://text/html;base64,' . base64_encode($html)); // 获取元标记 foreach($meta_tags as $tag=>$value) { // 遍历元标记 if(preg_match_all($attr_pattern, $value, $submatches)) { // 匹配属性中的代码 $attr_matches = array_merge($attr_matches, $submatches[1]); } } $all_script = implode(" ", array_merge($script_matches[2], $attr_matches)); // 合并所有代码为一个字符串
在上述程式碼中,我們使用
implode 函數將$script_matches[2]
和$attr_matches
中所有的JavaScript 程式碼片段合併為一個字串,使用換行符號分隔每個程式碼片段,方便進一步處理。
以上是PHP 正規表示式:如何匹配 HTML 中的所有 JavaScript 程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!