【问题标题】:Capture all occurrences of repeated formatted substrings捕获所有出现的重复格式化子字符串
【发布时间】:2016-06-11 11:14:37
【问题描述】:

我有一个遵循这种模式的字符串[:it]Stringa in italiano[:en]String in english

我正在尝试使用preg_match_all() 来捕获语言环境和相关字符串,即:

[1] => 'it',
[2] => 'en',
...
[1] => 'Stringa in italiano',
[2] => 'String in english'

我使用的正则表达式"/\[:(\w+)](.+?)(?=\[:\w+])/" (https://regex101.com/r/eZ1gT7/400) 只返回第一组数据。我做错了什么?

【问题讨论】:

  • 你需要字符串结尾,即$..\[:(\w+)\](.+?)(?=\[:\w+\]|$) ..regex101.com/r/eZ1gT7/401
  • 您可以将preg_split\[:(\w+)\]PREG_SPLIT_DELIM_CAPTURE 标志一起使用。它可能更具可读性。

标签: php regex preg-match-all


【解决方案1】:

最终格式化的片段不会满足您的前瞻需求。您将需要包含将字符串末尾的位置与交替匹配的选项。管道 (|) 表示“或”。美元符号 ($) 表示“字符串结尾”。

我正在使用否定字符类来匹配文字方括号。如果您的\w 足以满足您的项目,请随时保留您最初发布的那部分。

代码:(Demo)

$string = '[:it]Stringa in italiano[:en]String in english';

preg_match_all('~\[:([^]]+)](.+?)(?=$|\[:[^]]+])~', $string, $m);
var_export($m);

输出:

array (
  0 => 
  array (
    0 => '[:it]Stringa in italiano',
    1 => '[:en]String in english',
  ),
  1 => 
  array (
    0 => 'it',
    1 => 'en',
  ),
  2 => 
  array (
    0 => 'Stringa in italiano',
    1 => 'String in english',
  ),
)

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2012-09-14
    • 2015-12-24
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2020-06-02
    • 2016-03-18
    • 2015-01-07
    相关资源
    最近更新 更多