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