我有一些html页面,它看起来像:
<span>Some text</span>
<p>And again</p>
<table>
<thead>
<tr>
<th>Text</th>
<th>Text [some text]</th>
<th>Text</th>
</tr>
</thead>
<tbody>
<!--[content-->
<tr>
<td>again some txt but with [this]</td>
<td>in this td the same situation [oops]</td>
<td>hello [world]</td>
</tr>
<!--content]-->
</tbody>
</table>
<span>here is [the text]</span>
我需要从方括号中获取文本,但只需在注释字段中。我有2个reg exp,它们工作正常,但是分开。
/[^[\]]+(?=])/g - this is for text in brackets;
(?=<!--\[content)([\s\S]*?content]-->) - for commented fields.
但我无法将它结合起来。我正在尝试这个(?=<!--\[content)([^[\]]+(?=]))([\s\S]*?content]-->)
,但它不起作用。我不太了解regexp,我该如何结合呢?
UPD:对于输出,我只需要在注释字段(this,oops,world)之间的括号中添加文本。
答案 0 :(得分:1)
首先,我可以从一个简单的开始:
(?<=\[)[^\]\[]*(?=\])(?=[\s\S]*?<!--content\]-->)
<强>解释强>
(?<=\[)[^\]\[]*(?=\])
匹配任何方括号内的文字,
(?=[\s\S]*?<!--content\]-->)
预测任何后跟封闭内容标记的字符串。
它的声音很有意义!无论如何,但,请查看DEMO1。是的......它没用。那么,问题是为什么???
在上面的正则表达式中,前瞻性断言仍然存在一些问题,正如我之前在前面的解释中所提到的那样:
(?=[\s\S]*?<!--content\]-->)
预测任何后跟封闭内容标记的字符串。
这是错误,应该是:
(?=[\s\S]*?<!--content\]-->)
预测任何字符串后跟任何打开或关闭的内容标记。
所以,结论我们的问题是正则表达式[\s\S]*?
有时它只匹配“多个内容标记”。
解决方法强>
为了防止出现上述问题,我们可以将开放内容标记的另一个负面预测与[\s\S]*
生成的每个字符结合起来。因此,我们得到:
(?<=\[)[^\]\[]*(?=\])(?=(?:(?!<!--\[content-->)[\s\S])*?<!--content\]-->)
请注意
[\s\S]*
刚修改为
(?:(?!<!--\[content-->)[\s\S])*?
这意味着(?!<!--\[content-->)
会产生在[\s\S]*
生成的每个字符的前面。例如,如果[\s\S]*
生成ABCDEF...
,则会以这种方式生成否定前瞻:
(?!<!--\[content-->)A(?!<!--\[content-->)B(?!<!--\[content-->)C(?!<!--\[content-->)D(?!<!--\[content-->)E(?!<!--\[content-->)F...
最后,请检查DEMO2。看到了吗?这只是工作!
免责声明:只有您在问题上提供的简单示例,我的正则表达式才能正常工作。对于另一个复杂的例如一些递归结构,我无法保证。