PHP模式匹配备用数字


PHP pattern matching alternate numbers

如何计算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.

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

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

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

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

但是,我不知道如何匹配数字,这些数字对于要处理的其他文本来说是不同的。

您的解决方案只是用可选数字进行preg替换

preg_replace('/'['d*']/', $replacement, $fulltext);

TL;DR

您不需要preg_replace。请改用str_replace

请参阅下面的详细说明。


可能需要注意的是,括号[]在PCRE语法中具有特殊意义,因为它们表示字符类。这意味着你的模式可能没有达到你期望的效果。

例如

preg_replace('[]', 'foo', 'Lorem ipsum dolor sit amet, consectetur [] adipiscing elit. Phasellus quis lectus metus, at posuere neque.')

会给你

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

这可能根本不是你想要的。

这是因为PCRE还需要包围模式的分隔符。在这里,方括号将被视为分隔符,您最终会得到一个空模式。

也可以使用括号样式的分隔符,其中左括号和右括号分别是起始分隔符和结束分隔符。(){}[]<>都是有效的括号样式分隔符对。

相反,你应该使用

preg_replace('/'['d*']/', $replacement, $fulltext);

这将用文本的'反斜杠字符转义方括号,并提供了模式匹配表达式中的可选数字字符数。

如果希望替换字符串落在方括号内,而不是替换实际的方括号,则可以将模式括在圆括号中,并使用反向引用进行替换。

如果您想将特定的模式与特定的替换字符串相匹配(,其中模式比简单的子字符串搜索/替换更复杂),那么您应该使用preg_replace_callback_array但是,需要注意的是,此函数仅在PHP7中可用

示例

$newText = preg_replace_callback_array(
               [
                   '/'[(23)']/' => function ($match) {
                       return 'foo';
                   },
                   '/'[(24)']/' => function ($match) {
                       return 'bar';
                   },
               ],
               $fulltext
           );

这会给你一些像。。。

"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."

如果您真正需要的是基于子字符串搜索进行替换(例如[23]将被替换为字符串"foo",[24]将被替换为由字符串"bar"等),那么您不需要正则表达式。相反,您可以使用str_replace进行此操作。

下面是一个例子。。。

$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);

这会给你

"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."