我希望匹配所有具有组合_ [[或]] _
那部分我沮丧了:(_\[\[)|(\]\]_)
我现在需要帮助的部分,如何在这些实例中仅替换下划线?
换句话说,字符串:"_[[2, verb//substantiv//adjektiv]]_"
会产生字符串:"[[2, verb//substantiv//adjektiv]]"
感谢我能得到的任何帮助。
答案 0 :(得分:3)
您可以在此处使用的解决方案是简单匹配整个模式,并使用相同的模式替换它,而不使用封闭的下划线(_
)。
I created the example here btw.
示例:
$str = 'My _[[string to parse]]_ with some _[[examples]]_';
$parsed = preg_replace('/_\[\[([^(\]\]_)]*?)\]\]_/', "[[$1]]", $str);
echo $parsed;
输出:
My [[string to parse]] with [[examples]]
正则表达式解释说:
_\[\[
您要捕获的序列的起点([^((\]\]_))]*?)
捕获开始和结束序列之间的内容不结束序列本身\]\]_
结束序列通过匹配整个模式并使用捕获组捕获内容,您可以完全使用包含匹配模式中内容的新子字符串替换模式。
这是在preg_replace
的第二个参数"[[$1]]"
$1
这里代表捕获的组并包含它的内容,它将在两组方括号之间插值。
由于模式也与下划线(_
)匹配,但是这些也被删除了,但根本没有被第二个参数中的任何内容替换。
答案 1 :(得分:2)
你可以提出:
$regex = '~
_\[{2} # look for an underscore and two open square brackets
([^]]+) # capture anything that is not a closing bracket
\]{2}_ # followed by two closing square brackets and an underscore
~x'; # free space mode for this explanation
$string = "_[[2, verb//substantiv//adjektiv]]_";
# in the match replace [[(capture Group 1)]]
$new_string = preg_replace($regex, "[[$1]]", $string);
// new_string = [[2, verb//substantiv//adjektiv]]
答案 2 :(得分:1)
如果你想
匹配具有
组合的所有字符串_[[
或]]_
您可以使用此正则表达式:
^(?=.*_\[\[).+|(?=.*\]\]_).+$
^ // start of the string
(?=.*_\[\[) // if the string contains _[[
.+ // get the entire string (if the assert is correct)
| // OR operands (if the assert is not correct, let's check the following)
(?=.*\]\]_) // if the string contains ]]_
.+ // get the entire string
$ // end of the string
答案 3 :(得分:0)
我正在使用这种模式作为一个例子。
这里的目标是使用捕获括号。如果模式匹配,您将在匹配数组中找到索引为n°1的捕获字符串。
示例:
$pattern = '#_(\[\[[0-9]+\]\])_#';
$result = preg_match_all($pattern, '_[[22555]]_ BLA BLA _[[999]]_', $matches);
if (is_int($result) && $result > 0) {
var_dump($matches[1]);
}
<强>输出强>
array(2) {
[0]=>
string(9) "[[22555]]"
[1]=>
string(7) "[[999]]"
}
答案 4 :(得分:0)
尝试使用您的模式捕获括号[]
并将匹配替换为您捕获的内容,如下所示:
$pattern = "/_(\[\[)|(\]\])_/";
$test = "_[[2, verb//substantiv//adjektiv]]_";
$replace = preg_replace( $pattern ,"$1$2", $test );
echo $replace;
美元符号$
允许您使用括号来引用您捕获的内容。 $1
表示第一个捕获组,在本例中为(\[\[)
,表示第一对括号$2
引用第二对括号。由于您的模式使用|
运算符,因此只有一个捕获组具有匹配项,另一个将为空。