preg_match_all - 获取模式和字符串之间的部分

时间:2017-03-30 00:55:36

标签: preg-match

在这个例子中,我有一个包含许多已定义元素的大字符串 part of example string here。 在这个例子中,我从示例文件(从第一个(~32)波浪号开始到 ~120 3 )获得匹配,这在我的正则表达式中是正确的,但我需要更新正则表达式,使其从 ~120 3 反向获得第一个最接近的匹配,结果为:

  

PRIEDE EGLE BERZS LAPU KOKI

<?php

        $regex = '/~[1-9](.*?)\~120 3/s';
        preg_match($regex, $str, $matches);

        echo '<pre>';
        print_r($matches);
        exit();
    ?>

所以问题是: 我应该如何设置方向以获得字符串的一部分&#34;反向&#34;?如果我匹配~120 3,那么我得到的所有结果从~120 3反向直到我匹配波形符号+数字 - 〜[1-9]?

我当前正则表达式结果的附加图像并标记了几个元素:  *绿色 - 我知道并在我的想象中的元素 - 将开始反向搜索。  *灰色 - 正确的结果。  *红色 - 火焰匹配从 ~120 3

反向发现的内容

enter image description here

提前感谢您的建议!

1 个答案:

答案 0 :(得分:1)

所以问题是:

  

我应该如何设置方向以获得字符串的一部分&#34;反向&#34;?如果我匹配~120 3,那么我会反过来~120 3的所有结果,直到我匹配波形符号+数字 - ~[1-9]

无法在输入中更改Boost正则表达式匹配方向,但是,您可以使用前瞻来限制匹配的文本。

度Acc。根据要求,您需要

~[1-9]([^~]*(?:~(?![1-9])[^~]*)*)~120 3

请参阅regex demo

<强>详情:

  • ~[1-9] - 您的初始分隔符
  • ([^~]*(?:~(?![1-9])[^~]*)*) - 捕获第1组匹配:
    • [^~]* - 除了波浪号之外的任何0 +字符
    • (?:~(?![1-9])[^~]*)* - 0+序列:
      • ~(?![1-9]) - 未跟随19的数字的代字号
      • [^~]* - 除了波浪号之外的任何0 +字符
  • ~120 3 - 结束分隔符

但是,它不会捕获您需要的内容,因为它会在开头包含一些数字和空格。也许你的起始分隔符应该是~[\d\s]+,然后前瞻应该是(?![\d\s]+)。请参阅another demo