一節(jié)聊到正則表達式的簡單應(yīng)用,不足之處歡迎留言交流。
Javascript正則表達式示例之基本概念
今天,我們來看一下,如何使用正則表達式,匹配HTML標簽及相關(guān)信息。
為什么要加上相關(guān)信息呢?
因為,如果您想寫一個HTML語法樹解析庫的時候,可能會用到。
下面內(nèi)容用到的語法
|:表示或者,要么前面,要么后面
(?<=我前面出現(xiàn)的內(nèi)容)要匹配的內(nèi)容:只匹配前面出現(xiàn)的字符之后的內(nèi)容。
可視圖
要匹配的內(nèi)容(?=我前面出現(xiàn)的內(nèi)容):只匹配后面出現(xiàn)的字符之前的內(nèi)容。
可視圖
分組捕獲:一對完整的小括號(),表示一個組。
\數(shù)字:你要使用那一個分組捕獲到的內(nèi)容。
.*?:在正則表達式中,. 表示匹配任意字符,* 表示匹配 0 到任意次的前一個字符,? 表示非貪婪匹配,即盡可能匹配最少的字符。因此,.*? 表示匹配任意字符零次或多次,但盡可能匹配最少的字符。這個表達式通常用于匹配一個字符串中的所有內(nèi)容,但是避免貪婪匹配導(dǎo)致的匹配錯誤。
^: 表示匹配開始
[要匹配的字符]:只匹配括號中的字符。
比如[0-9]、[a-z]、[A-Z]、[0-9a-zA-Z]、[0-9abc]等等。
[^要匹配的字符]:[]中加^表示匹配不是“要匹配的字符”。
<body><div id="left">left</div><div id="right">right</div></body>
const text=document.body.innerText;
text=text.replace(/\n/g, '');
console.log(text);
//輸出: leftright
假設(shè)沒有innerText的功能呢?實現(xiàn)這個功能,使用正則表達式無疑是最方便的。
var text=document.body.innerHTML.replace(/<[^>]+>/g,'');
text=text.replace(/\n/g, '');
console.log(text);
//輸出: leftright
匹配結(jié)果
可視圖
是的,這個正則表達式的意思是,查找<>并且包含他們之間不為>的一段字符串。
到這里,您以為就結(jié)束了嗎?您在網(wǎng)上搜索匹配HTML標簽,可能也會得到這么一個結(jié)果(例如:<[^>]+>、<.*?>、等等),但實際上這只是開始,我們本著只要是程序就可能有bug的原則,所以我們來看下面一個例子。
const strHtml='<span data-code=">">>是大于符號。</span>';
const strRes=strHtml.replace(/<[^>]+>/g, '');
console.log(strRes);
// ">>是大于符號。
[可憐]bug出現(xiàn)了,怎么辦?別著急,請看下一個知識點。
2.1、首先,我們先解決第一點最后的bug。
const strHtml='<span data-code=">">>是大于符號。</span>';
// 一個小改動即可。
const strRes=strHtml.replace(/<("[^"]*"|[^>])+>/g, '');
console.log(strRes);
// >是大于符號。
可視圖
完美[打臉] ,還沒結(jié)束……
const strHtml="<span data-code='>'>>是大于符號。</span>";
const strRes=strHtml.replace(/<("[^"]*"|[^>])+>/g, '');
console.log(strRes);
// '>>是大于符號。
甲:這不是我寫的HTML不標準,是你的解析庫兼容性不好,瀏覽器都可以識別,你為什么不可以?
已:……。
const strHtml=`<i code="<"><小于符號。</i><i code='>'>>大于符號。</i>`;
// 繼續(xù)改造
const strRes=strHtml.replace(/<((["'])+.*?\2|[^>])+>/g, '');
console.log(strRes);
// <小于符號。>大于符號。
匹配結(jié)果
可視圖
是的,利用正則表達式分組捕獲的語法,實現(xiàn)了上面的需求。
2.2 現(xiàn)在,我們來看看,如何找到某個標簽的所有屬性。
const strHtml=`
<input type='text' disabled value="" class="txt txt-md" v-on:click="save('button')" />
`;
上面的例子中,有多種情況,我們首先來整理出來。
屬性1:type='text'
/[\w]+=(["'])+.*?/
屬性2:disabled
/[\w]+/
屬性3:value=""
/[\w]+=(["'])+.*?/
屬性4:class="txt txt-md"
/[\w]+=(["'])+.*?/
屬性5:v-on:click="save('button')"
/[\w:]+=(["'])+.*?/
其他情況:歡迎討論。
把所有情況連起來之后。
const strHtml=`<input type='text' disabled value="" class="txt txt-md" v-on:click="save('button')" />`;
const tagAttrs=strHtml.match(/(?<=\s)[\w:-]+(=(["']).*?\2)*/g) || [];
console.log(tagAttrs);
// ["type='text'", 'disabled', 'value=""', 'class="txt txt-md"', `v-on:click="save('button')"`]
匹配結(jié)果
可視圖
人人為我,我為人人,歡迎您的瀏覽,我們一起加油吧。
1題. 編寫一個Filter,需要()
A. 繼承Filter 類
B. 實現(xiàn)Filter 接口
C. 繼承HttpFilter 類
D. 實現(xiàn)HttpFilter接口
正確答案為:B
第2題. 自定義標簽的配置文件放在________
A. WebRoot
B. lib
C. classes
D. WEB-INF
正確答案為:D
第3題. 有關(guān)會話跟蹤技術(shù)描述正確的是(多選)
A. Cookie是Web服務(wù)器發(fā)送給客戶端的一小段信息,客戶端請求時,可以讀取該信息發(fā)送到服務(wù)器端
B. 關(guān)閉瀏覽器意味著會話ID丟失,但所有與原會話關(guān)聯(lián)的會話數(shù)據(jù)仍保留在服務(wù)器上,直至?xí)掃^期
C. 在禁用Cookie時可以使用URL重寫技術(shù)跟蹤會話
D. 隱藏表單域?qū)⒆侄翁砑拥紿TML表單并在客戶端瀏覽器中顯示
正確答案為:ABC
第4題. 在J2EE中,重定向到另一個頁面,以下()語句是正確的
A. request . sendRedirect(“http :// www . svse . com . cn”);
B. request . sendRedirect();
C. response . sendRedirect(“http: // www . svse . com . cn”);
D. response .sendRedirect();
正確答案為:C
第5題. EL表達式,${10 mod3},執(zhí)行結(jié)果為:
A. 10 mod 3
B. 1
C. 3
D. null
正確答案為:B
第6題. 自定義標簽的作用是
A. 編寫和使用方便
B. 規(guī)定是這樣的,如果不用,別人會說我們不專業(yè)
C. 可以減少jsp中的java代碼,將代碼與界面標簽分離,簡化前臺開發(fā)
D. 連數(shù)據(jù)庫
正確答案為:C
第7題. request.getRequestDispatcher().forward(request,response)稱之為
A. 流轉(zhuǎn)
B. 轉(zhuǎn)發(fā)
C. 重定向
D. 導(dǎo)航
正確答案為:B
第8題. 有關(guān)Servlet的生命周期說法正確的有 (多選)
A. Servlet的生命周期由Servlet實例控制
B. init()方法在創(chuàng)建完Servlet實例后對其進行初始化,傳遞的參數(shù)為實現(xiàn)ServletContext接口的對象
C. service()方法響應(yīng)客戶端發(fā)出的請求
D. destroy()方法釋放Servlet實例
正確答案為:BCD
第9題. 在J2EE中,給定某Servlet的代碼如下,編譯運行該文件,以下陳述正確的是()。(選擇一項)
Public class Servlet1 extends HttpServlet{
Publicvoid init() throws ServletException{
}
Publicvoid service(HttpServletRequest request,HttpServletResponse response)
ThrowsServletException,IOException{
PrintWriterout=response.getWriter();
out.println(“hello!”);
}
}
A. 編譯該文件時會提示缺少doGet()或者dopost()方法,編譯不能夠成功通過
B. 編譯后,把Servlet1.class放在正確位置,運行該Servlet,在瀏覽器中會看到輸出文字:hello!
C. 編譯后,把Servlet1.class放在正確位置,運行該Servlet,在瀏覽器中看不到任何輸出的文字
D. 編譯后,把Servlet1.class放在正確位置,運行該Servlet,在瀏覽器中會看到運行期錯誤信息
正確答案為:B
第10題. 在Servlet中,response.getWriter()返回的是____________
A. JspWriter對象
B. PrintWriter對象
C. Out對象
D. ResponseWriter對象
正確答案為:B
第11題. 在web.xml中使用___________標簽配置過濾器
A. <filter>和<filter-mapping>
B. <filter-name>和<filter-class>
C. <filter>和<filter-class>
D. <filter-pattern>和<filter>
正確答案為:A
第12題. 自定義標簽的描述文件在web.xml中配置正確的
A. <taglib>
<tag-uri>bob-tld</tag-uri>
<tag-location>/WEB-INF/bob.tld</tag-location>
</taglib>
B. <tag>
<taglib-uri>bob-tld</taglib-uri>
<taglib-location>/WEB-INF/bob.tld</taglib-location>
</tag>
C. <jsp-taglib>
<taglib-uri>bob-tld</taglib-uri>
<taglib-location>/WEB-INF/bob.tld</taglib-location>
</jsp-taglib>
D. <jsp-config>
<taglib>
<taglib-uri>bob-tld</taglib-uri>
<taglib-location>/WEB-INF/bob.tld</taglib-location>
</taglib>
</jsp-config>
正確答案為:D
第13題. J2EE中,Servlet API為使用Cookie,提供了()類。
A. javax.servlet.http.Cookie
B. javax.servlet.http.HttpCookie
C. javax.servlet. Cookie
D. javax.servlet.http.HttpCookie
正確答案為:A
該模塊定義了操作HTML的工具。
將字符串 s 中的字符``&`` 、 < 和 > 轉(zhuǎn)換為安全的HTML序列。 如果需要在 HTML 中顯示可能包含此類字符的文本,請使用此選項。 如果可選的標志 quote 為真值,則字符 (") 和 (') 也被轉(zhuǎn)換;這有助于包含在由引號分隔的 HTML 屬性中,如 <a href="...">。
將字符串 s 中的所有命名和數(shù)字字符引用 (例如 >, >, >) 轉(zhuǎn)換為相應(yīng)的Unicode字符。 此函數(shù)使用HTML 5標準為有效和無效字符引用定義的規(guī)則,以及 HTML 5 命名字符引用列表。
html 包中的子模塊是:
html.parser —— 具有寬松解析模式的HTML / XHTML解析器
html.entities – HTML 實體定義
這個模塊定義了一個 HTMLParser 類,為 HTML(超文本標記語言)和 XHTML 文本文件解析提供基礎(chǔ)。
創(chuàng)建一個能解析無效標記的解析器實例。
如果 convert_charrefs 為 True (默認值),則所有字符引用( script/style 元素中的除外)都會自動轉(zhuǎn)換為相應(yīng)的 Unicode 字符。
一個 HTMLParser 類的實例用來接受 HTML 數(shù)據(jù),并在標記開始、標記結(jié)束、文本、注釋和其他元素標記出現(xiàn)的時候調(diào)用對應(yīng)的方法。要實現(xiàn)具體的行為,請使用 HTMLParser 的子類并重載其方法。
這個解析器不檢查結(jié)束標記是否與開始標記匹配,也不會因外層元素完畢而隱式關(guān)閉了的元素引發(fā)結(jié)束標記處理。
填充一些文本到解析器中。如果包含完整的元素,則被處理;如果數(shù)據(jù)不完整,將被緩沖直到更多的數(shù)據(jù)被填充,或者 close() 被調(diào)用。data 必須為 str 類型。
如同后面跟著一個文件結(jié)束標記一樣,強制處理所有緩沖數(shù)據(jù)。這個方法能被派生類重新定義,用于在輸入的末尾定義附加處理,但是重定義的版本應(yīng)當(dāng)始終調(diào)用基類 HTMLParser 的 close() 方法。
重置實例。丟失所有未處理的數(shù)據(jù)。在實例化階段被隱式調(diào)用。
返回當(dāng)前行號和偏移值。
返回最近打開的開始標記中的文本。 結(jié)構(gòu)化處理時通常應(yīng)該不需要這個,但在處理“已部署”的 HTML 或是在以最小改變來重新生成輸入時可能會有用處(例如可以保留屬性間的空格等)。
下列方法將在遇到數(shù)據(jù)或者標記元素的時候被調(diào)用。他們需要在子類中重載。基類的實現(xiàn)中沒有任何實際操作(除了 handle_startendtag() ):
這個方法在標簽開始的時候被調(diào)用(例如: <div id="main"> )。
tag 參數(shù)是小寫的標記名。attrs 參數(shù)是一個 (name, value) 形式的列表,包含了所有在標記的 <> 括號中找到的屬性。name 轉(zhuǎn)換為小寫,value 的引號被去除,字符和實體引用都會被替換。
實例中,對于標簽 <A HREF="https://www.cwi.nl/">,這個方法將以下列形式被調(diào)用 handle_starttag('a', [('href', 'https://www.cwi.nl/')]) 。
html.entities 中的所有實體引用,會被替換為屬性值。
此方法被用來處理元素的結(jié)束標記(例如: </div> )。
tag 參數(shù)是小寫的標簽名。
類似于 handle_starttag(), 只是在解析器遇到 XHTML 樣式的空標記時被調(diào)用( <img ... />)。這個方法能被需要這種特殊詞法信息的子類重載;默認實現(xiàn)僅簡單調(diào)用 handle_starttag() 和 handle_endtag() 。
這個方法被用來處理任意數(shù)據(jù)(例如:文本節(jié)點和 <script>...</script> 以及 <style>...</style> 中的內(nèi)容)。
這個方法被用于處理 &name; 形式的命名字符引用(例如 >),其中 name 是通用的實體引用(例如: 'gt')。如果 convert_charrefs 為 True,該方法永遠不會被調(diào)用。
這個方法被用來處理 NNN; 和 NNN; 形式的十進制和十六進制字符引用。例如,> 等效的十進制形式為 > ,而十六進制形式為 > ;在這種情況下,方法將收到 '62' 或 'x3E' 。如果 convert_charrefs 為 True ,則該方法永遠不會被調(diào)用。
這個方法在遇到注釋的時候被調(diào)用(例如: <!--comment--> )。
例如, <!-- comment --> 這個注釋會用 ' comment ' 作為參數(shù)調(diào)用此方法。
Internet Explorer 條件注釋(condcoms)的內(nèi)容也被發(fā)送到這個方法,因此,對于 <!--[if IE 9]>IE9-specific content<![endif]--> ,這個方法將接收到 '[if IE 9]>IE9-specific content<![endif]' 。
這個方法用來處理 HTML doctype 申明(例如 <!DOCTYPE html> )。
decl 形參為 <!...> 標記中的所有內(nèi)容(例如: 'DOCTYPE html' )。
此方法在遇到處理指令的時候被調(diào)用。data 形參將包含整個處理指令。例如,對于處理指令 <?proc color='red'> ,這個方法將以 handle_pi("proc color='red'") 形式被調(diào)用。它旨在被派生類重載;基類實現(xiàn)中無任何實際操作。
注解 HTMLParser 類使用 SGML 語法規(guī)則處理指令。使用 '?' 結(jié)尾的 XHTML 處理指令將導(dǎo)致 '?' 包含在 data 中。
當(dāng)解析器讀到無法識別的聲明時,此方法被調(diào)用。
data 形參為 <![...]> 標記中的所有內(nèi)容。某些時候?qū)ε缮惖闹剌d很有用。基類實現(xiàn)中無任何實際操作。
該模塊定義了四個詞典, html5、 name2codepoint、 codepoint2name、以及 entitydefs。
將 HTML5 命名字符引用 1 映射到等效的 Unicode 字符的字典,例如 html5['gt;']=='>'。 請注意,尾隨的分號包含在名稱中(例如 'gt;'),但是即使沒有分號,一些名稱也會被標準接受,在這種情況下,名稱出現(xiàn)時帶有和不帶有 ';'。另見 html.unescape()。
將 XHTML 1.0 實體定義映射到 ISO Latin-1 中的替換文本的字典。
將 HTML 實體名稱映射到 Unicode 代碼點的字典。
將 Unicode 代碼點映射到 HTML 實體名稱的字典。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。