删除字符串中括号中特定值之外的所有内容 PHP

Remove everything outside specific value in brackets in a string PHP

我正在尝试找到一种解决方案,以解决如何删除括号中特定值以外的所有内容,包括括号中的值。 这就是我的意思。我有这个字符串

$str = "[:de]Some german text[:en]Some English text[:]";

我想要实现的是获取 [:de] 和 [:en] 之间的文本并删除其他所有内容,因此结果必须是

$str = "Some german text";

我猜它应该是一些 preg_match 或一些正则表达式解决方案,但我发现的只是,如何删除中间的文本,而不是保留中间的文本并删除其他所有内容。

欢迎提出任何想法。

我猜,

(?<=\[:de\]).*?(?=\[:en\])

在这里可能工作正常。

测试

$re = '/(?<=\[:de\]).*?(?=\[:en\])/s';
$str = '[:de]Some german text 1[:en]Some English text[:] [:de]Some german text 2[:en]Some English text[:]
[:de]Some german text 3[:en]Some English text[:]';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

输出

array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(18) "Some german text 1"
  }
  [1]=>
  array(1) {
    [0]=>
    string(18) "Some german text 2"
  }
  [2]=>
  array(1) {
    [0]=>
    string(18) "Some german text 3"
  }
}

如果您希望 simplify/modify/explore 表达式,regex101.com. If you'd like, you can also watch in this link 的右上面板已对其进行说明,它将如何匹配一些样本输入。


正则表达式电路

jex.im 可视化正则表达式:

感谢 Emma 的回答,这就是我想出的解决方案。

$re = '/(?<=\[:de\]).*?(?=\[:en\])/s';
$result = preg_match($re, $str, $match);
$result = $match[0];