带有斜杠的preg_match模式存储在变量

时间:2017-03-07 01:44:32

标签: regex preg-match

我在使用这个正则表达式时遇到了麻烦。 (https://regex101.com/r/vQLlyY/1

我的模式正在运作,并且是:

(?<=Property: )(.*?)(?= \(Contact)|(?<=Property: )(.*?)(?= - )

您将在链接中看到在这两个字符串中提取属性文本:

Property: This is the property (Contact - Warren) 
Property: This is another property - Warren

在我的代码中,此模式存储如下:

$this->rex["property"][2] = '/(?<=Property: )(.*?)(?= \(Contact)|(?<=Property: )(.*?)(?= - )/s'

然后,它被提取出来:

foreach ($this->rex as $key => $value ) {
    if (isset($value[$provider])) {
        preg_match_all($value[$provider], $emailtext, $matches);
        if (!empty($matches[1][0])) {
            $emaildetails[$key] = trim(preg_replace("/\r|\n/", "", $matches[1][0]));
        } else {
            $emaildetails[$key] = "";
        }
    }
}

在此示例中,$ provider = 2

我的问题我确定是使用了黑名单,因为我无法获取此代码以获取模式的(Contact部分,我需要从中删除括号。我知道代码有效,因为我有许多其他模式在使用。此外,如果模式存储如下,这适用于属性文本:

$this->rex["property"][2] = '/(?<=Property: )(.*?)(?= - )/s

那么,我是否正确使用转义支架存储模式,或者甚至是我的问题?提前谢谢!

1 个答案:

答案 0 :(得分:0)

由于您使用的是单独的捕获组,因此不同的路径最终会出现在不同的匹配索引中。例如,第一行(Contact - Warren one)将匹配结果存储在索引1中,其中第二行在索引1中具有空字符串,并且您在索引2中查找匹配结果。

要解决此问题,您可以使用非捕获组,也可以重写表达式以使用正向前瞻。前者的好处包括允许量词。后者的好处包括没有将整个匹配结果放在你的0匹配索引中。

非捕获组示例:(?<=Property: )(.*?)\s*(?:\(Contact|- ) https://regex101.com/r/vQLlyY/2

积极前瞻的示例:(?<=Property: )(.*?)(?= \(Contact| - ) https://regex101.com/r/vQLlyY/3