请阅读此问题的第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 ... ] ... ... ';
答案 0 :(得分:2)
我会选择否定的课程而不是.*?
,如果substring_3
是AA
,那么:
\[[^]]*?AA[^]]*?\](?:[^[]*\[[^]]*?/[^]]*?AA[^]]*?\])?
在:
$result = preg_replace('#\[[^]]*?'.$sub_str.'[^]]*?\](?:[^[]*\[[^]]*?/[^]]*?'.$sub_str.'[^]]*?\])?#', '', $str);
\[ # 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