2

正規表現は私のものではありません。:(

次のような複数のサブ文字列を含む可能性のある文字列があります。

[var1="111" var2="222" var3="222" var4="444"]

基本的に、各オカレンスを、各変数を取得する関数の結果に置き換える必要があります。

$string = '[var1="111" var2="222" var3="333" var4="444"]';    
$regex = 'var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"';

function doit($matches){
    return "<strong>".implode(", ", $matches) ."</strong>";
}

echo preg_replace_callback($regex,'doit',$string);

私は111、222、333、444を期待しています。

しかし、私は愛を感じていません。どんな助けでもいただければ幸いです!

編集:いくつかの説明..

私は質問のために単純化していた。

  1. 「vars」は実際には「var1」とは呼ばれず、「var2」は[recID = "22" template = "theName" option = "some value"、type="list"]のようになります。

  2. コールバックは、私の単純な実装よりも複雑になります...「id」を使用してデータベースに接続し、レコードを取得してテンプレートに挿入します...したがって、コールバックが必要です...

  3. 一致する値は、数値だけでなく、ほとんど何でもかまいません。

4

2 に答える 2

1

他の答えはより良い解決策かもしれませんが、preg_replace_callbackでそれを行う方法は次のとおりです。

$string = '[var1="111" var2="222" var3="333" var4="444"]';

// Note: regular expressions need to start and end with /
$regex = '/var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"/';

function doit($matches){
    // The first element of matches is the complete
    // match, shift is here just to get rid of it
    // (probably a better way to do this)
    array_shift($matches);
    return "<strong>".implode(", ", $matches) ."</strong>";
}
echo preg_replace_callback($regex,'doit',$string);
于 2010-03-10T23:15:27.957 に答える
1

私は2つのステップでそれを行います:

  1. タグを取得する
  2. 各タグの属性を取得する

次に例を示します。

function doit($match) {
    $parts = preg_split('/(\w+="[^"]*")/', $match[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    foreach ($parts as $part) {
        if (trim($part) !== "") {
            if (!preg_match('/^(\w+)="([^"]*)"$/', $part, $match)) {
                // syntax error
            } else {
                var_dump($match);
            }
        }
    }
}

$str = '[var1="111" var2="222" var3="333" var4="444"]';
$re = '/\[((?:[^"[\]]+|"[^"]*")*)]/';
preg_replace_callback($re, 'doit', $str);

これにより、構文エラーを検出することもできます。

入力を文字ごとに読み取り、トークンが見つかったコンテキストに応じてトークンを決定する方が効率的であるため、これは完全なソリューションではありません。

于 2010-03-10T23:32:59.743 に答える