PHP preg_match_all正则表达式用于分割字符串

4

您好,我可以帮助您完成正则表达式吗?

我需要处理这样格式的字符串:

<FC012D>{p:19}Ja?<BF093C> Du möchtest<BC>zur Königin?<BC><BF040027><BF07>{p:20}<F8012D>Hmm...<BF093C><BC>Du bist gekommen um den<BC>Titel Kriegerin<BC>zu erhalten?<BD><BC>Verstehe.<BF093C> Das ist ganz<BC>schön tapfer für so<BC>eine junge Dame.<BD><BC>Die Königin wird sicher<BC>auch sehr<BC>überrascht sein.<BD><BC>{t:19}Bitte sehr,<BC>geh direkt hinein.<BD><FF>{t:20}Treibe Dich hier nicht<BC>herum, wenn Du hier<BC>nichts zu suchen hast!<BD><FF>

我需要用preg_match_all将它们拆分为一个数组,以获取3种类型的数组元素:

  • 带有<>的字符串
  • 带有{}的字符串
  • 其他两个选项之间的任何其他内容作为单独的元素。

这是我到目前为止所拥有的:

preg_match_all("/<[^>]*>|{(.*?)}|(\(.*?)\)/", $input_lines, $output_array);

我需要求助于最后一个选项,即捕获两个字符串之间的内容。 http://www.phpliveregex.com/p/kdW


1
你需要在结果中使用 <>{} 吗?期望的输出是什么?此外,你需要在生成的数组中保留空项吗? - Wiktor Stribiżew
@WiktorStribiżew 是的,我需要它们出现在结果中,请看 http://www.phpliveregex.com/p/kdW - 那里唯一缺失的是<>和{}匹配之间的文本。谢谢! - Alex
1个回答

3
使用具有PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY标志和以下正则表达式的preg_split:
'~(<[^<>]*>|{[^{}]*})~'

请看 正则表达式演示。它匹配并捕获两种类型的子字符串到第一组中:
  • <[^<>]*> - 以 < 开头,后跟0个或多个非 <> 字符,然后是 >
  • {[^{}]*} - 以 { 开头,后跟0个或多个非 {} 字符,然后是 }
PREG_SPLIT_DELIM_CAPTURE 将所有匹配项包含在结果数组中。 PREG_SPLIT_NO_EMPTY 将删除不必要的空元素。
请看 PHP 演示:
$s = '<FC012D>{p:19}Ja?<BF093C> Du möchtest<BC>zur Königin?<BC><BF040027><BF07>{p:20}<F8012D>Hmm...<BF093C><BC>Du bist gekommen um den<BC>Titel Kriegerin<BC>zu erhalten?<BD><BC>Verstehe.<BF093C> Das ist ganz<BC>schön tapfer für so<BC>eine junge Dame.<BD><BC>Die Königin wird sicher<BC>auch sehr<BC>überrascht sein.<BD><BC>{t:19}Bitte sehr,<BC>geh direkt hinein.<BD><FF>{t:20}Treibe Dich hier nicht<BC>herum, wenn Du hier<BC>nichts zu suchen hast!<BD><FF>';
$res = preg_split('~(<[^<>]*>|{[^{}]*})~', $s, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($res);

如果您需要匹配 (...) 子字符串,只需添加一个备选项 - '~(<[^<>]*>|{[^{}]*}|\([^()]*\))~' - Wiktor Stribiżew
1
太好了!非常感谢@wiktor。我可以百分之百地与此一起工作。祝你周末愉快! - Alex
1
@WiktorStribiżew 现在我明白你想说什么了...抱歉我的错..完美的答案,今天我学会了PREG_SPLIT_DELIM_CAPTURE,+1给你。 - Sahil Gulati
真糟糕,我本来要和家人共度时光的... 我打算尝试一下这些标志来回答这个问题!好样的@WiktorStribiżew,像往常一样。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接