在匹配的文本中预先形成多个preg_replace

时间:2018-06-15 04:05:18

标签: php regex

如果一对方括号内有逗号和空格,我试图用一个右方括号和一个开口方括号替换它。

基本上,我有一个看起来像这样的文本块:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi laoreet 
lobortis blandit. Proin in nulla mauris.[3, 8, 19, 45] Aenean dictum 
sollicitudin nibh, non semper mauris semper id.[52, 58] Donec at varius eros. 
Sed in risus nec tellus vehicula semper. In id elit vel nunc ornare faucibus. 
Integer feugiat erat mauris, in tempus leo imperdiet ac.[23]

我正试图让它看起来像这样:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi laoreet 
lobortis blandit. Proin in nulla mauris.[3][8][19][45] Aenean dictum 
sollicitudin nibh, non semper mauris semper id.[52][58] Donec at varius eros. 
Sed in risus nec tellus vehicula semper. In id elit vel nunc ornare faucibus. 
Integer feugiat erat mauris, in tempus leo imperdiet ac.[23]

我编写了一个preg_replace函数,但只有在括号集中存在一次才会执行替换:

$output = preg_replace("/(\[\d*), (\d*\])/", "$1][$2", $input);

如何修改我的正则表达式,以便在匹配的文本中执行多次替换?

1 个答案:

答案 0 :(得分:2)

快速的方法是:

, (?=[^][]*\])

Live demo

故障:

  • ,[ ]匹配空格字符后面的逗号
  • (?=开始积极前瞻
    • [^][]*\]断言是否在没有匹配括号
    • 的情况下使用右括号
  • )前瞻结束

PHP代码:

echo preg_replace('/, (?=[^][]*\])/', '][', $str);

但如果它可能在文本的某个地方有一个关闭括号而没有被打开,那么这更加防弹:

(?:\[(?=[^][]*\])|\G(?!\A))[^],]*\K, 

Live demo