【问题标题】:PHP: Cannot get regex pattern to repeat [duplicate]PHP:无法让正则表达式模式重复[重复]
【发布时间】:2022-01-26 22:31:16
【问题描述】:

我有一个看起来像这样的输入字符串:

$txt = '!1 aaa !2 bb bb !5 cc cc cc !4 dd';

换句话说,我有许多字段,每个字段都以感叹号和数字开头。

它想把它变成这样的东西:

<div class="x1">aaa</div>
<div class="x2">bb bb</div>
<div class="x5">cc cc cc</div>
<div class="x4">dd</div>

div 类派生自输入字符串中感叹号后面的数字。

我试过这个 PHP 命令:

preg_replace("/!([0-9]) (.*) !/U", "<div class=\"x\\1\">\\2</div>\n!", $txt)

但这会产生这个输出:

<div class="x1">aaa</div>
!2 bb bb <div class="x5">cc cc cc</div>
!4 dd

很明显最后一个字段 (!4 dd) 不匹配,因为它没有最后一个!。我假设第二个字段(!2 bb bb)不匹配,因为它的初始!实际上来自于第一个字符串的替换。

所以,我想我知道它为什么不起作用,但我不知道如何正确地做到这一点。

【问题讨论】:

  • 你需要/!([0-9])\s*(.*?)\s*(?=!\d|$)//!(\d+)\s*(.*?)\s*(?=!\d|$)/s
  • 请注意,如果您的字段不包含感叹号!(开头除外)并且不为空,您可以使用这个简单的模式:!(\d+) ([^!]*[^! ])

标签: php regex pcre


【解决方案1】:

你可以使用

echo preg_replace('~!(\d+)\s*(.*?)\s*(?=!\d|$)~s', "<div class=\"x\$1\">\$2</div>\n", $txt);

请参阅 regex demoPHP demo详情

  • ! - 一个 ! 字符
  • (\d+) - 第 1 组:一位或多位数字
  • \s* - 零个或多个空格
  • (.*?) - 第 2 组:尽可能少的任何零个或多个字符
  • \s* - 零个或多个空格
  • (?=!\d|$) - 一个正向的前瞻,它与紧跟在 ! + 数字或字符串结尾的位置相匹配。

【讨论】:

  • 太棒了,维克托!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多