0

HTML を含む PHP 変数があります。文字列の出現をチェックし、その文字列を関数の結果に置き換える必要があります。

関数はまだ作成されていませんが、製品の ID となる変数を 1 つだけ渡す必要があります。

たとえば、Web サイトに製品があり、ユーザーが wysiwyg エディターに何かを入力できるようにしたいと考えて{{product=68}}います。その製品の情報を含むプリセット div コンテナーが表示されます。この場合、製品のデータベース内の ID は 68 ですが、1 からその他の値までの範囲である可能性があります。

製品 ID の配列を作成し、文字列の最初の部分を検索することを考えましたが、かなり面倒かもしれないと感じました。常駐の正規表現の天才の 1 人が、私が何をする必要があるかを明らかにすることができると思います。

問題は... {{product=XXX}}XXX が 1 より大きい整数である可能性がある文字列を検索し、その数をキャプチャして、文字列の出現を究極的に置き換える置換文字列を作成する関数に渡すにはどうすればよいですか?

4

2 に答える 2

1

{{product=##}} に一致する正規表現を次に示します (入力する桁数は関係ありません)。

{{product=([0-9]+)}}

編集:申し訳ありませんが、1から始まる必要があるとは思いませんでした:

{{product=([1-9][0-9]*)}}

番号をキャプチャする場合は、次のようにします。

$string = '{{product=68}}';
preg_match_all( '%{{product=([1-9][0-9]*)}}%', $string, $matches );
$number = (int) $matches[1][0];

preg_match_all の理解を深めるために、次の内容を示し$matchesます。

array
  [0] => array // An array with strings that matched the whole regexp
    [0] => '{{product=68}}'
  [1] => array // An array with strings that were in the first "match group", indicated by paranthesis in the regexp
    [0] => '68'

たとえば$matches、文字列 '{{product=68}}{{product=70}}' がある場合、次のようになります。

array
  [0] => array
    [0] => '{{product=68}}'
    [1] => '{{product=70}}'
  [1] => array
    [0] => '68'
    [1] => '70'
于 2013-01-17T12:42:23.403 に答える
1

あなたのために小さなクラスを作りました。それはあなたが必要とすることをするはずです。

<?php
class textParser{
    const _pattern = '/{{([a-z\-_]+)=([0-9]+)}}/';
    static protected $_data = false;

    static public function setData($data){
        self::$_data = $data;
    }
    static function parseStr($str){
        // Does a preg_replace according to the 'replace' callback, on all the matches
        return preg_replace_callback(self::_pattern, 'self::replace', $str);
    }
    protected static function replace($matches){
        // For instance, if string was {{product=1}}, we check if self::$_data['product'][1] is set
        // If it is, we return that
        if(isset(self::$_data[$matches[1]][$matches[2]])){
            return self::$_data[$matches[1]][$matches[2]];
        }
        // Otherwise, we just return the matched string
        return $matches[0];
    }
}
?>

単体テスト・基本的な使い方

<?php
// User generated text-string
$text = "Item {{product=1}} and another {{category=4}} and a category that doesnt exist: {{category=15}}";
// This should probably come from a database or something
$data = array(
    "product"=>array(
        1=>"<div>Table</div>"
      , 2=>"<div>Tablecloth</div>"
    )
  , "category"=>array(
        4=>"Category stuff"
    )
);
// Setting the data
textParser::setData($data);
// Parsing and echoing
$formated = textParser::parseStr($text);
echo $formated;
// Item <div>Table</div> and another Category stuff and a category that doesnt exist: {{category=15}}
?>
于 2013-01-17T13:24:52.137 に答える