正则表达式匹配包含三个方括号中包含的子串的文本块

时间:2015-12-11 12:42:18

标签: php regex

给出一整段文字:

  

欢迎来到[[[[RegExr v2.0 by gskinner.com]]]

     

编辑表达式&要查看匹配项的文字。滚动比赛或   表达细节。使用ctrl-z撤消错误。保存&分享   与朋友或社区的表达。 [[[完整的参考文献&帮助就是   可在图书馆中找到,或观看视频教程。

     

]]测试的示例文本:abcdefghijklmnopqrstuvwxyz   ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 _ + - 。,!@#$%^& *(); / |<>"' 12345   -98.7 3.141 .6180 9,000 +42   555.123.4567 + 1-(800)-555-2468 foo@demo.net bar.ba@test.co.uk www.demo.com

我需要一个正则表达式,可以验证所有打开的三方括号' [[['在字符串中配对并关闭']]]'。嵌套括号和以']]开头的字符串'或以' [[['应该返回false。

我知道有很多方法可以遍历字符串并对其进行评估,但我可能会处理非常大的文本字符串,并且希望正则表达式能够更快/更好地提升性能。

感谢。

1 个答案:

答案 0 :(得分:1)

我使用模式/[\[]{3}[^\[\]]*[\]]{3}/提出了以下解决方案。不幸的是,第三个$text案例仍然会返回false,所以我正在研究它。可以在行动here中看到正则表达式模式。

$text = 'Some [[[default]]] [[[text]]] here'; //valid
//$text = 'Some [[[default text [[[here]]]'; //invalid
//$text = 'Some [[[default text [here]]]'; //invalid

// Get the number of opening and closing brackets
$open_bracket_count = substr_count($text, '[[[');
$close_bracket_count = substr_count($text, ']]]');

// Check if number of '[[[' is same as ']]]'
if ($open_bracket_count === $close_bracket_count)
{
  // Match valid bracketed substrings in the text
  $validation_pattern = '/[\[]{3}[^\[\]]*[\]]{3}/';
  $valid_match_count = preg_match_all($validation_pattern, $text, $valid_matches);

  // Valid matches should equal the number of substrings attempting to be wrapped in brackets
  if ($valid_match_count === $open_bracket_count)
  { 
    return true;
  }
  else
  {
    return false;
  }
}
// If not equal, we know right away the string contains invalid brackets
else
{
  return false;
}