2

我在源中有这个示例字符串: @include_plugin:PluginName param1=value1 param2=value2@

我想要的是@include_plugin:*@从一个源中找到所有出现的结果PluginName以及每个paramN=valueN.

此刻我正在摆弄这样的东西(并尝试了许多变体):(/@include_plugin:(.*\b){1}(.*\=.*){0,}@/使用此资源)。不幸的是,我似乎无法定义一个给我想要的结果的模式。有什么建议么?

更新示例: 假设我在 .tpl 文件中有此字符串。@include_plugin:BestSellers limit=5 fromCategory=123@

我希望它返回一个数组:

0 => BestSellers, 
1 => limit=5 fromCategory=123 

甚至更好(如果可能的话):

0 => BestSellers, 
1 => limit=5, 
2 => fromCategory=123
4

5 回答 5

3

您可以分两步完成。首先使用正则表达式捕获该行,然后将参数分解为一个数组:

$subject = '@include_plugin:PluginName param1=value1 param2=value2@';
$pattern = '/@include_plugin:([a-z]+)( .*)?@/i';
preg_match($pattern, $subject, $matches);

$pluginName = $matches[1];
$pluginParams = isset($matches[2])?explode(' ', trim($matches[2])):array();
于 2012-08-10T13:08:58.847 回答
1

您可以使用此正则表达式:

/@include_plugin:([a-zA-Z0-9]+)(.*?)@/

PluginName 在第一个捕获组中,参数在第二个捕获组中。请注意,参数(如果有)具有前导空格。

除非已知最大参数数量,否则不可能编写正则表达式来提取更好的情况。

您可以通过首先修剪前导和尾随空格来进行额外处理,然后沿/\s+/.

于 2012-08-10T13:01:09.250 回答
1
$string = "@include_plugin:PluginName1 param1=value1 param2=value2@ @include_plugin:PluginName2@";

preg_match_all('/@include_plugin:([a-zA-Z0-9]+)\s?([^@]+)?/', $string, $matches);
var_dump($matches);

这是你想要的?

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(55) "@include_plugin:PluginName1 param1=value1 param2=value2"
    [1]=>
    string(27) "@include_plugin:PluginName2"
  }
  [1]=>
  array(2) {
    [0]=>
    string(11) "PluginName1"
    [1]=>
    string(11) "PluginName2"
  }
  [2]=>
  array(2) {
    [0]=>
    string(27) "param1=value1 param2=value2"
    [1]=>
    string(0) ""
  }
}
于 2012-08-10T13:12:59.273 回答
1

我不确定您PluginName可以包含的字符集或参数/值,但如果它们受到限制,您可以使用以下正则表达式:

/@include_plugin:((?:\w+)(?:\s+[a-zA-Z0-9]+=[a-zA-Z0-9]+)*)@/

这将捕获插件名称,后跟任何字母数字参数列表及其值。可以通过以下方式看到输出:

<?
$str = '@include_plugin:PluginName param1=value1 param2=value2@
@include_plugin:BestSellers limit=5 fromCategory=123@';

$regex = '/@include_plugin:((?:\w+)(?:\s+[a-zA-Z0-9]+=[a-zA-Z0-9]+)*)@/';

$matches = array();
preg_match_all($regex, $str, $matches);

print_r($matches);
?>

这将输出:

Array
(
    [0] => Array
        (
            [0] => @include_plugin:PluginName param1=value1 param2=value2@
            [1] => @include_plugin:BestSellers limit=5 fromCategory=123@
        )

    [1] => Array
        (
            [0] => PluginName param1=value1 param2=value2
            [1] => BestSellers limit=5 fromCategory=123
        )

)

要以您需要的格式获取数组,您可以使用以下命令遍历结果:

$plugins = array();
foreach ($matches[1] as $match) {
    $plugins[] = explode(' ', $match);
}

And now you'll have the following in $plugins:

Array
(
    [0] => Array
        (
            [0] => PluginName
            [1] => param1=value1
            [2] => param2=value2
        )

    [1] => Array
        (
            [0] => BestSellers
            [1] => limit=5
            [2] => fromCategory=123
        )

)
于 2012-08-10T13:19:32.090 回答
0

此正则表达式将为您提供多个组,每个插件一个。

((?<=@include_plugin:)(.+))
于 2012-08-10T13:03:25.663 回答