正则表达式不返回propper匹配

时间:2013-05-30 09:32:16

标签: php regex string

我目前在PHP服务器上遇到正则表达式的一些问题。

这是我目前的常规表达方式:

/\{content="(?:([^"\|]*)\|?)+"\}/

我希望它匹配:

{content="default|test|content|text"}

然后在比赛中返回:

default
test
content
text

但是当我现在执行它时,我会在比赛中找回它:

array (
  0 => '{content="default|test|content|text"}',
  1 => '',
)

你们有没有问题我做错了什么?

亲切的问候,

Youri Arktesteijn

2 个答案:

答案 0 :(得分:2)

你可以使用积极的前瞻和积极的外观。

三个阶段:

  1. 我们匹配起始引用,但不在我们的输出中捕获它。然后我们匹配任何不是管道的东西。然后我们匹配一个管道而没有抓住它。
  2. 管道之间的非管道
  3. 管道和报价之间的非管道和非报价。
  4. 这是代码。

    <?php
    
    $string = '{content="default|test|content|text"}';
    $my_matches = preg_match_all('!((?<=")([^|]+)(?=[|])|(?<=[|])([^|]+)(?=[|])|(?<=[|])([^|"]+)(?="))!',$string,$matches);
    print_r($matches[0]);
    
    ?>
    

    <强>输出

    Array
    (
    [0] => default
    [1] => test
    [2] => content
    [3] => text
    )
    

    一旦你有逻辑工作,那么你可以配对前瞻和后面的字符来缩短匹配字符串。

    $my_matches = preg_match_all('!(?<=["|])([^|"]+)(?=[|"])!',$string,$matches);
    

    <强>输出

    Array
    (
    [0] => default
    [1] => test
    [2] => content
    [3] => text
    )
    

答案 1 :(得分:1)

我不知道如何使用单行正则表达式。无论如何,请尝试以下代码,

<?php
if (preg_match('/\{content="(?:([^\"]+))"\}/', $sContent, $matches) > 0) {
    $result = explode('|', $matches[1]);
} else {
    $result = array();
}

echo '<pre>' . print_r($result, true) . '</pre>';
?>