我正在尝试编写一个正则表达式,这将有助于在HTML代码中查找非翻译文本。
翻译文本意味着他们正在经历特殊标记:或通过构建:$ {...}
实施例。非翻译:
<h1>Hello</h1>
翻译的文本是:
<h1><fmt:message key="hello" /></h1>
<button>${expression}</button>
我写了以下表达式:
\<(\w+[^>])(?:.*)\>([^\s]+?)\</\1\>
找到正确的字符串,如:
<p>text<p>
正确跳过
<a><fmt:message key="common.delete" /></a>
但也抓住了:
<li><p><fmt:message key="common.delete" /></p></li>
我无法弄清楚如何在此表达式中添加$ {...}字符串的异常 有人能帮助我吗?
答案 0 :(得分:2)
如果我理解正确,您需要确保“标记”中的数据不包含fmt:messsage
或${....}
您可以使用与.
结合使用的否定前瞻来断言.
捕获的字符不属于以下情况之一:
/<(\w+)[^>]*>(?:(?!<fmt:message|\$\{|<\/\1>).)*<\/\1>/i
如果您想避免在代码中捕获任何“代码”,则可以忽略<fmt:message
部分,只使用[^<]
代替.
- 仅匹配非{ {1}}
<
从评论中添加如果您还要排除“空”标记,请添加另一个负面预测 - 这次/<(\w+)[^>]*>(?:(?!\$\{)[^<])*<\/\1>/i
- 确保标记内的内容不为空或仅包含空格:
(?!\s*<)
答案 1 :(得分:1)
如果格式很简单,可以试试这个:
<(\w+)>(?:(?!<fmt:message).)+</\1>
答案 2 :(得分:0)
我已经成功使用了这样一个简单的,
<([^>]+)[^>]*>([^<]*)</\1>
当然,如果有任何带有'&lt;'的CDATA在那些它不会那么好的工作。但是对于简单的XML应该没问题。
答案 3 :(得分:0)
重写为更正式的问题:
你能匹配吗
aba
但不是
aca
没有抓住
abcba
?
是
FSM:
Start->A->B->A->Terminate
插入abcba并运行它
Start is ready for input.
a -> MATCH, transition to A
b -> MATCH, transition to B
c -> FAIL, return fail.
答案 4 :(得分:0)