0

我有一个包含 HTML 的 PHP 变量。我需要检查字符串的出现,并将该字符串替换为函数的结果。

该函数尚未编写,但只需要传递给它的一个变量,即产品的 ID。

例如,网站有产品,我希望用户能够在所见即所得的编辑器中输入一些东西{{product=68}},它会显示一个包含该产品信息的预设 div 容器。在这种情况下,产品在数据库中的 ID 为 68,但它可以是从 1 到任何值的任何值。

我想过创建一个产品 ID 数组并搜索字符串的第一部分,但觉得这可能相当麻烦,我认为我们的常驻 reg exp 天才可能能够阐明我需要做什么。

所以问题是......我如何在字符串中搜索{{product=XXX}}XXX 可以是大于一的整数的出现次数,捕获该数字,并将其传递给创建替换字符串的函数,该替换字符串最终替换字符串的出现次数?

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 回答