2

ソースに次のサンプル文字列があります。 @include_plugin:PluginName param1=value1 param2=value2@

私が望むのは、と each@include_plugin:*@の結果を持つソースからのすべての出現を見つけることです。PluginNameparamN=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

2ステップでできます。最初に正規表現で行をキャプチャし、次にパラメーターを配列に分解します。

$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は最初のキャプチャグループにあり、パラメータは2番目のキャプチャグループにあります。パラメータがある場合は、先頭にスペースがあることに注意してください。

パラメータの最大数がわかっていない限り、正規表現を記述してさらに適切なケースに抽出することはできません。

最初に先頭と末尾のスペースをトリミングしてから、に沿って分割することで、追加の処理を行うことができます/\s+/

于 2012-08-10T13:01:09.250 に答える
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);
}

これで、次のものが に含まれます$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 に答える
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 に答える
0

この正規表現は、プラグインごとに 1 つずつ、複数のグループを提供します。

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