0

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

这是我目前的正则表达式:

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

我希望它匹配:

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

然后在比赛中返回:

default
test
content
text

但是当我目前执行它时,我会在我的比赛中得到这个:

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

你们中有人有我做错的问题吗?

亲切的问候,

Youri Arktesteijn

4

2 回答 2

2

您可以使用积极的前瞻和积极的后瞻。

三个阶段:

  1. 我们匹配开始的报价,但不要在我们的输出中捕获它。然后我们匹配任何不是管道的东西。然后我们匹配一个管道而不捕获它。
  2. 管间非管
  3. 管道和引号之间的非管道和非引号。

这是代码。

<?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
)
于 2013-05-30T10:11:27.937 回答
1

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

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

echo '<pre>' . print_r($result, true) . '</pre>';
?>
于 2013-05-30T09:59:04.183 回答