只替换部分正则表达式匹配

时间:2016-02-26 13:29:39

标签: php regex

我希望匹配所有具有组合_ [[或]] _

的字符串

那部分我沮丧了:(_\[\[)|(\]\]_)我现在需要帮助的部分,如何在这些实例中仅替换下划线?

换句话说,字符串:"_[[2, verb//substantiv//adjektiv]]_"会产生字符串:"[[2, verb//substantiv//adjektiv]]"

感谢我能得到的任何帮助。

5 个答案:

答案 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]]

请参阅a demo on regex101.com以及on ideone.com

答案 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

Demo here

答案 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引用第二对括号。由于您的模式使用|运算符,因此只有一个捕获组具有匹配项,另一个将为空。