需要帮助在Regex中,两个正则表达式之间的子串

时间:2014-04-01 09:59:32

标签: php regex

请阅读此问题的第1部分: -

Need Help In Regex, substring between two brackets

$result = '';
$str = ' ... [ ... SUB_STRING_TO_BE_SEARCHED ... ] ... [ ... / ... SUB_STRING_TO_BE_SEARCHED ... ] ... [ ... THIS_SHOULD_NOT_GET_SELECTED ... ]';
$sub_str = '';
if( preg_match('#\[.*?'.$sub_str.'.*?\]#' , $str) ) {
    if ( preg_match( REGEX_2 , $str ) ) {
        $result = preg_replace( REGEX_3 , '', $str);
    } else {
        $result = preg_replace('#\[.*?'.$sub_str.'.*?\]#', '', $str);
    }
}

$ result应该是: -

$result = " ...  ... [ ... THIS_SHOULD_NOT_GET_SELECTED ... ]";

然而,对于$ str_2: -

$str_2 = ' ... [ ... SUB_STRING_TO_BE_SEARCHED ... ] ... [ ... THIS_SHOULD_NOT_GET_SELECTED ... ]';

$ result也应该保留: -

$result = " ...  ... [ ... THIS_SHOULD_NOT_GET_SELECTED ... ]";

说明: -

第1步:好的,从上一个问题我可以轻松得到这个字符串: -

[ ... THIS_SHOULD_NOT_GET_SELECTED ... ]

步骤2: - REGEX_2应检查是否存在: -

[ ... / ... THIS_SHOULD_NOT_GET_SELECTED ... ]

(注意正斜杠,我们假设它只会在THIS_SHOULD_NOT_GET_SELECTED和左括号[之间出现一次。)

步骤3: - 如果找到REGEX_2,则REGEX_3应选择此子字符串: -

[ ... SUB_STRING_TO_BE_SEARCHED ... ] ... [ ... / ... SUB_STRING_TO_BE_SEARCHED ... ]

另一个例子: -

$str_3 = ' ... [ ... AA ... ] ... [ ... / ... AA ... ] ... [ ... B ... ] ... [ ... AA ... ] ... [ ... / ... AA ... ] ... [ ... AA ... ]';
$substring_3 = 'AA'
$result = ' ...  ... [ ... B ... ] ...  ... ';

1 个答案:

答案 0 :(得分:2)

我会选择否定的课程而不是.*?,如果substring_3AA,那么:

\[[^]]*?AA[^]]*?\](?:[^[]*\[[^]]*?/[^]]*?AA[^]]*?\])?

在:

$result = preg_replace('#\[[^]]*?'.$sub_str.'[^]]*?\](?:[^[]*\[[^]]*?/[^]]*?'.$sub_str.'[^]]*?\])?#', '', $str);

regex101 demo


\[          # Match [
  [^]]*?    # Any number of non ]
  AA        # The substr
  [^]]*?    # Any number of non ]
\]          # Match ]
(?:
  [^[]*     # Any number of non [
  \[        # Match [
    [^]]*?  # Any number of non ]
    /       # Match /
    [^]]*?  # Any number of non ]
    AA      # The substr
    [^]]*?  # Any number of non ]
  \]        # Match ]
)?          # Make this group optional