我正在使用RegEx来匹配来自文本区域的一组狭窄的TinyMCE HTML。宽度太大,会产生径流,因此我正在用JavaScript编写测试代码。
我的问题是,为什么$ 3不仅匹配“ 1000px”,而且匹配表格标记后的文档的其余部分?
<script language="javascript">
// change table width
function adjustTable(elem0,elem1) {
// debugging, place results in div
elem1.innerHTML = elem0.innerHTML.replace(/^(.*)(\u003Ctable.*?\s*?\w*?width\u003D[\u0022\u0027])(\d+px)([\u0022\u0027].*?\u003E)(.*)$/img,"$3");
}
</script>
<button type="button" onclick="adjustTable(document.getElementById('myTable'),document.getElementById('myResult'))">RegEx</button>
<div id="myTable">
<table width="1000px">
<thead>
<tr><th colspan="3">Table Header</th></tr>
</thead>
<tbody>
<tr><td>alpha</td><td>beta</td><td>gamma</td></tr>
</tbody>
</table>
</div>
<textarea id="myResult">
</textarea>
是的,我确实了解RegEx和HTML是不应交叉的流,因为HTML很复杂,等等。我正在尝试使HTML的子集可打印。
我看不到它如何以多种方式匹配。
以下是$ 3的结果。
1000px
<thead>
<tr><th colspan="3">Table Header</th></tr>
</thead>
<tbody>
<tr><td>alpha</td><td>beta</td><td>gamma</td></tr>
</tbody>
</table>
它匹配1000px,但是table标记后面有多余的东西,这很奇怪,因为我以为我要在table标记中强制匹配。有什么想法吗?
让我们通过记录正则表达式的整个结果来调试它:
function adjustTable(elem0,elem1) {
// debugging, place results in div
console.log ( (/^(.*)(\u003Ctable.*?\s*?\w*?width\u003D[\u0022\u0027])(\d+px)([\u0022\u0027].*?\u003E)(.*)$/img).exec(elem0.innerHTML) );
}
输出为:
[
0: " <table width="1000px">"
1: " "
2: "<table width=""
3: "1000px"
4: "">"
5: ""
index: 1
input: "↵ <table width="1000px">↵ <thead>↵ <tr><th colspan="3">Table Header</th></tr>↵ </thead>↵ <tbody>↵ <tr><td>alpha</td><td>beta</td><td>gamma</td></tr>↵ </tbody>↵ </table>↵"
]
因此,如果您想获得结果“ 1000px”,请使用以下代码:
(/^(.*)(\u003Ctable.*?\s*?\w*?width\u003D[\u0022\u0027])(\d+px)([\u0022\u0027].*?\u003E)(.*)$/img).exec(elem0.innerHTML)[3]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句