好的,我有一条消息,可以使用正则表达式来确定其中是否有方括号,如果有,请确定它们是否未关闭。
例如,打开方括号是这样的:[code]
结束是这样的:[/code]
但不仅仅是代码bbc代码可以在方括号内。
我希望能够做的是使用包含整个消息的变量,并以某种方式确定方括号内是否有任何没有结束标记的单词,表示为:{{ 1}}这个词,而不是[/
打开课程标记以]
单词开头,而不是以[
所以,如果我在变量中有这样的东西:
好的,所以这里是整个script.php文件,其中包含所有Recent Module代码。所以我们从Main函数开始,从函数参数...
中检索$ params]
它会知道[code]function module_recent($params)
{
global $context, $txt;
// Grab the params, if they exist.
if (is_array($params))
{
未关闭并在最后添加[code]
但是,如果我有这样的事情:
[/code]
应该知道[table]
[tr][td]Hello World[/td][/tr]
[tr][td]This is not closed...
和[table]
以及[tr]
没有关闭,它应该按照以下顺序在最后添加结束标记:
[td]
而不是[/td]
,最后是[/tr]
但也有其他标签,如[/table]
如果我可以填充数组中方括号内的所有标记,并调用一个检查它是否同时具有开始和结束标记的函数,那将会很棒,这样就不会影响非人们放入消息的bbc代码标签就是原因。
任何人都可以帮我一个Reg。要做到这一点吗?至少如果有人可以帮助我开始这个非常好的。
谢谢你们:)
答案 0 :(得分:0)
我要做的是编写一个扫描仪和一个解析器。平衡括号问题是语言理论中的经典问题。
正则表达式可用于模式匹配和标记提取。你的问题是一个语法问题,你需要一个解析器来解决这个问题。
在这种情况下不需要复杂的解析器。堆栈就足够了。请参阅下面的高级算法。
enum TokenType{
StartTag,
EndTag,
Text
}
struct Token {
string Value;
TokenType TokenType;
}
Token GetNextToken() {
// returns the next token in the input string or null if end of the string.
}
bool MatchingTags(Token startTag, Token endTag)){
// check if startTag and endTag match
}
bool CheckTags(){
Stack stack = new Stack();
while( (Token t = GetNextToken()) != null )
{
switch(t.TokenType){
case TokenType.StartTag:
stack.push(t);
break;
case TokenType.EndTag:
Token lastPushed = stack.pop();
if( ! MatchingTags(lastPushed, t)){
return false
}
break;
}
}
if (! stack.IsEmpty()){
return false
}else{
return true;
}
}
注意:此算法还会检查正确的嵌套:[A] [B] [/ A] [/ B]无效 注意:这只是一个代码示例,可以为您提供一个想法。请根据您的编程语言/框架进行优化和调整。