如何匹配左右分隔符的字符串?

时间:2016-12-17 05:14:15

标签: php regex preg-match

我有以下字符串:

$string = '{(|Teste 1|)}{(|Teste_2|)}{(|3 3 3 3|)}';

我想提取 {(| |)} 之间的每个子字符串。

我正在尝试:

$string = '{(|Teste 1|)}{(|Teste_2|)}{(|3 3 3 3|)}';
preg_match('/([^{\(\|])(.*)([^\|\)}])/', $string, $matches);

echo '<pre>';
print_r($matches);
echo '</pre>';
die();

输出:

Array
(
    [0] => Teste 1|)}{(|Teste_2|)}{(|3 3 3 3
    [1] => T
    [2] => este 1|)}{(|Teste_2|)}{(|3 3 3 
    [3] => 3
)

期望的输出:

Array
(
    [0] => Teste 1
    [1] => Teste_2
    [2] => 3 3 3 
)

如何完成此结果?
THKS!

4 个答案:

答案 0 :(得分:5)

您的正则表达式语法不正确,您想要使用preg_match_all()

$str = '{(|Teste 1|)}{(|Teste_2|)}{(|3 3 3 3|)}';
preg_match_all('/{\(\|([^|]*)\|\)}/', $str, $matches);
print_r($matches[1]);

输出:

Array
(
    [0] => Teste 1
    [1] => Teste_2
    [2] => 3 3 3 3
)

答案 1 :(得分:2)

这是使用str_replace

的另一种方式
$string = '{(|Teste 1|)}{(|Teste_2|)}{(|3 3 3 3|)}';
      $array = explode("|)}",str_replace("{(|","",$string));
      print_r(array_slice($array,0, -1));

不是最好的方法,但你可以记住。

答案 2 :(得分:2)

你可以尝试下面的代码

<?php

$string = '{(|Teste 1|)}{(|Teste_2|)}{(|3 3 3 3|)}';
preg_match('/{\(\|(.*?)\|\)}{\(\|(.*?)\|\)}{\(\|(.*?)\|\)}/', $string, $matches);    

preg_match_all('/{\(\|(.*?)\|\)}/', $string, $matches_all);
echo '<pre>';
print_r($matches);
print_r($matches_all);
echo '</pre>';

答案 3 :(得分:1)

您可以使用Lookaround来匹配所需的输出:

$string = '{(|Teste 1|)}{(|Teste_2|)}{(|3 3 3 3|)}';
preg_match_all('/(?<=\{\(\|).*?(?=\|\)\})/', $string, $matches);
print_r($matches[0]);

正则表达式演示:https://regex101.com/r/95wUo8/1

输出:

Array
(
    [0] => Teste 1
    [1] => Teste_2
    [2] => 3 3 3 
)