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