给出以下示例文本:
<input type="text" value="<? print(variable); ?>">
<? /*<br><br><small>Data:</small>
<input type="text" value="<? print(data); ?>"> */ ?>
<textarea><? print(yuppy); ?></textarea>
要捕获所有内容(一个一个)。和?>我用:
/<\?\s*([\s\S]+?)\s*\?>/g
这个正则表达式的问题是它甚至可以匹配<?和?>里面的/ * * /或// (注释)这不是期望的行为。
当这些字符串不在注释中时,如何改善该正则表达式以正确匹配这些字符串?
需要明确的是,正确的匹配项应为:
1) print(variable);
2) /*<br><br><small>Data:</small>
<input type="text" value="<? print(data); ?>"> */
3) print(yuppy);
相反,使用我的正则表达式,第二个匹配项是:
/*<br><br><small>Data:</small>
<input type="text" value="<? print(data);
更新:
乔什·克罗齐耶(Josh Crozier)的回答几乎是正确的,但有一点错误
他的正则表达式<\?\s*((?:.*\/\*[\s\S]+\*\/.*)|(?:[\s\S]+?))\s*\?>
与https://regex101.com/r/oL5iV0/2错误匹配:
<? /* hello */ ?>
html
<? /* world*/ ?>
甚至使用https://regex101.com/r/qW7mR7/1:
<input type="text" value="<? print(code); ?>"> <? /* */ ?>
在最新的示例中,仅当出现换行符时,它才正确匹配。在第一个示例中,即使有换行符也无法正确匹配
您可以使用以下模式(删除空格和注释以使其与javascript一起使用):
<\? # opening tag
[^?\/]* # all that is not a ? or a /
(?:
\/ # a slash:
(?:
(?![\/*]) [^?\/]* # - not followed by a slash or a *
|
\/.*(?:\n[^?\/]*)? # - that starts a single line comment
|
\* # - that starts a multiline comment
[^*]* (?:\*+(?!\/)[^*]*)* # (comment content)
(?:\*\/ [^?\/]* | $) # */ is optional
)
|
\?(?!>) [^?\/]* # a ? not followed by a >
)*
(?:\?>|$) # optional closing tag ?>
请注意,这种模式不会造成催化倒退,因为毕竟<\?
这是可选的,尤其是结束标记?>
和多行注释的结尾*/
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句