开发者

Regexp for finding tags without nested tags

开发者 https://www.devze.com 2022-12-15 10:50 出处:网络
I\'m trying to write a regexp which will help to find non开发者_Python百科-translated texts in html code.

I'm trying to write a regexp which will help to find non开发者_Python百科-translated texts in html code.

Translated texts means that they are going through special tag: or through construction: ${...}

Ex. non-translated:

<h1>Hello</h1>

Translated texts are:

<h1><fmt:message key="hello" /></h1>
<button>${expression}</button>

I've written the following expression:

\<(\w+[^>])(?:.*)\>([^\s]+?)\</\1\>

It finds correct strings like:

<p>text<p>

Correctly skips

<a><fmt:message key="common.delete" /></a>

But also catches:

<li><p><fmt:message key="common.delete" /></p></li>

And I can't figure out how to add exception for ${...} strings in this expression Can anybody help me?


If I understand you properly, you want to ensure the data inside the "tag" doesn't contain fmt:messsage or ${....}

You might be able to use a negative-lookahead in conjuction with a . to assert that the characters captured by the . are not one of those cases:

/<(\w+)[^>]*>(?:(?!<fmt:message|\$\{|<\/\1>).)*<\/\1>/i

If you want to avoid capturing any "tags" inside the tag, you can ignore the <fmt:message portion, and just use [^<] instead of a . - to match only non <

/<(\w+)[^>]*>(?:(?!\$\{)[^<])*<\/\1>/i

Added from comment If you also want to exclude "empty" tags, add another negative-lookahead - this time (?!\s*<) - ensure that the stuff inside the tag is not empty or only containing whitespace:

/<(\w+)[^>]*>(?!\s*<)(?:(?!\$\{)[^<])*<\/\1>/i


If the format is simple as in your examples you can try this:

<(\w+)>(?:(?!<fmt:message).)+</\1>


Rewritten into a more formal question:

Can you match

aba

but not

aca

without catching

abcba ?

Yes.

FSM:

Start->A->B->A->Terminate

Insert abcba and run it

Start is ready for input. 
a -> MATCH, transition to A
b -> MATCH, transition to B
c -> FAIL, return fail.


I've used a simple one like this with success,

<([^>]+)[^>]*>([^<]*)</\1>

of course if there is any CDATA with '<' in those it's not going to work so well. But should do fine for simple XML.


also see

https://blog.codinghorror.com/parsing-html-the-cthulhu-way/

for a discussion of using regex to parse html

executive summary: don't

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号