我在使用这个正则表达式时遇到了麻烦。 (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
那么,我是否正确使用转义支架存储模式,或者甚至是我的问题?提前谢谢!
答案 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。