PHP模式匹配备用数字

时间:2015-11-09 03:51:44

标签: php pattern-matching

有人可以建议我如何在php中计算匹配[]或[7]的模式吗?

我需要匹配不同字符串中的特定模式,如下例所示:

Lorem ipsum dolor sit amet, consectetur [] adipiscing elit. Phasellus quis lectus metus, at posuere neque.

Lorem ipsum dolor sit amet, consectetur [23] adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh [24] eget orci convallis at posuere leo convallis. Sed blandit augue [25] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [26] augue.

在第一个示例中,empty []将指示需要匹配模式并替换字符串的单个点。

第二个示例的数字表示多个唯一点,其中字符串需要匹配并替换为唯一内容。

我使用以下代码成功匹配第一个示例:

preg_replace('[]', $replacement, $fulltext);

但是,我不确定如何匹配其他要处理的文本的数字。

2 个答案:

答案 0 :(得分:2)

您的解决方案只是用可选数字

进行preg替换
preg_replace('/\[\d*\]/', $replacement, $fulltext);

答案 1 :(得分:0)

TL; DR;

您不需要preg_replace。请改用str_replace

有关详细说明,请参阅下文。

可能需要注意的是,[]括号preg_replace('[]', 'foo', 'Lorem ipsum dolor sit amet, consectetur [] adipiscing elit. Phasellus quis lectus metus, at posuere neque.') PCRE syntax中具有特殊含义,因为它们表示character classes。这意味着你的模式可能没有做你期望它在这里做的事情。

例如

"fooLfooofoorfooefoomfoo fooifoopfoosfooufoomfoo foodfooofoolfooofoorfoo foosfooifootfoo fooafoomfooefootfoo,foo foocfooofoonfoosfooefoocfootfooefootfooufoorfoo foo[foo]foo fooafoodfooifoopfooifoosfoocfooifoonfoogfoo fooefoolfooifootfoo.foo fooPfoohfooafoosfooefoolfoolfooufoosfoo fooqfooufooifoosfoo foolfooefoocfootfooufoosfoo foomfooefootfooufoosfoo,foo fooafootfoo foopfooofoosfooufooefoorfooefoo foonfooefooqfooufooefoo.foo"

会给你

()

这可能不是你想要的。

这是因为PCRE还需要delimiters封闭模式。这里的括号将被视为分隔符,最后会出现一个空模式。

  

也可以使用括号样式分隔符,其中开始和结束括号分别是起始和结束分隔符。 {}[]<>preg_replace('/\[\d*\]/', $replacement, $fulltext); 都是有效的支架式分隔符对。

相反,你应该使用

\

这会使用文本的$newText = preg_replace_callback_array( [ '/\[(23)\]/' => function ($match) { return 'foo'; }, '/\[(24)\]/' => function ($match) { return 'bar'; }, ], $fulltext ); 反斜杠字符转义括号,并提供一个可选的数字字符数,使其符合模式匹配表达式。

如果您希望替换字符串落在括号内,而不是替换实际的括号,可以将图案用圆括号括起来,并使用back references进行替换。

如果要将特定模式与特定替换字符串匹配(模式比简单子字符串搜索/替换更复杂),则应使用preg_replace_callback_array代替。 但是,重要的是要注意此功能仅适用于PHP 7

实施例

"Lorem ipsum dolor sit amet, consectetur foo adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh bar eget orci convallis at posuere leo convallis. Sed blandit augue [25] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [26] augue."

哪会给你类似......

$fulltext = 'Lorem ipsum dolor sit amet, consectetur [23] adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh [24] eget orci convallis at posuere leo convallis. Sed blandit augue [25] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [26] augue.';
$searchStrings = [
                  '[23]',
                  '[24]',
                  '[25]',
                  '[26]',
                 ];
$replacements  = [
                  '[foo]',
                  '[bar]',
                  '[baz]',
                  '[quix]',
                 ];
$newText = str_replace($searchStrings, $replacements, $fulltext);

如果您真正需要的是根据子字符串搜索进行替换(这样[23]将被替换为字符串&f;&#39;并且[24]将替换为字符串&#39; bar&#39;等...)然后你不需要正则表达式。相反,您可以使用str_replace

这是一个例子......

"Lorem ipsum dolor sit amet, consectetur [foo] adipiscing elit. Phasellus quis lectus metus, at posuere neque. Sed pharetra nibh [bar] eget orci convallis at posuere leo convallis. Sed blandit augue [baz] vitae augue scelerisque bibendum. Vivamus sit amet libero turpis, non venenatis urna. In blandit, odio convallis suscipit venenatis, ante ipsum cursus [quix] augue."

哪个给你

class A{
    MyClass* m;
    vector<MyClass*> vm;
    vector<vector<MyClass> > vvm;
    pair<int,MyClass*> pim;
};