如何在一个主题php中preg_replace相同的项目?

时间:2017-01-24 22:06:07

标签: php regex preg-replace matching

我对一个案件有疑问。

我使用php preg_replace()函数来格式化此字符串中的数据:

12:05 Place1 12:40 14:00 16:30 Place2 "Test" 29 Janury

我需要它像这样输出:

<li>29 January - Place1 - 12:05</li>
<li>29 January - Place2 "Test" - 12:40 14:00 16:30</li>

我的正则表达式:

/(\d[0-9]:\d[0-9]).+?(\D+).+?(\d[0-9]\s(January|February|March))/

我目前正在使用以下内容:

$text = "12:05 Place1 12:40 14:00 16:30 Place2 "Test" 29 Janury";
$data = preg_replace("/(\d[0-9]:\d[0-9]).+?(\D+).+?(\d[0-9]\s(January|February|March))/", "<li>$3 - $2 - $1</li>", $text);
echo $data;

它只显示第一场比赛的问题,

  • 1月29日 - 地点1 - 12:05
  • 也许有人知道如何解决这个案子?
    谢谢:)

    1 个答案:

    答案 0 :(得分:0)

    在一个正则表达式中是不可能的,因为你想在PCRE引擎到达它之前使用字符串末尾的匹配。您需要分两步执行此操作:

    1. preg_match()PREG_OFFSET_CAPTURE一起捕获从字符串末尾到另一个变量的日期。使用它提供的偏移量来截断原始字符串。
    2. preg_match_all()截断的字符串以获取时间&amp;作为数组放置,然后迭代数组以使用每个匹配&amp;用于创建列表的日期变量。 '/((?:\s*+\d\d:\d\d)++)\s++((?:.(?!\d\d:\d\d\s))++)\s*+/'是一种合适的模式。