PHP模式匹配交替数字

3

我可以如何在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);

但是,我不确定如何将与其他要处理的文本不同的数字进行匹配。
2个回答

2

您的解决方案只需要使用 preg_replace 函数并加上可选的数字即可。

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

你明白这里的括号被视为分隔符了吗?也就是说,这与说preg_replace('/\d*/', $replacement, $fulltext);没有什么区别。 - Sherif
您已经正确转义了括号,但请注意,由于仍然没有分隔符,因此此表达式仍然无效。表达式是正确的,但是您仍然需要添加分隔符,否则 preg_replace 将以 Delimiter must not be alphanumeric or backslash 的错误失败。如果在回答中修复了这个问题,我会给予赞同。 - Sherif

0

简短概述

你不需要使用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但是,请注意,此函数仅适用于PHP 7

示例

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

preg_replace('/\[\d*\]+/', $replacement, $fulltext); 也是错误的... 这将匹配任意数量的闭合括号。 - MiltoxBeyond
你说得对。我不知道怎么会有一个 + 滑进去的。已经修复了,谢谢 :) - Sherif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接