再次编辑以使其更加清晰。
Wichphp正则表达式模式将为我提供一个始终包含2个值的匹配数组,该数组是由"wordA"或"wordB"分隔的字符串的2部分。如果字符串不包含这些单词,只需将字符串作为第一个数组返回,在第二个数组中返回null即可。
示例:
preg_match("pattern","foo wordA bar",$match), $match will contain array['foo', 'bar']
preg_match("pattern","foo wordB bar",$match), $match will contain array['foo', 'bar']
preg_match("pattern","foo bar test",$match), $match will contain array['foo bar test', null]
我知道$match第一个值总是字符串,所以我不写它。
老问题:
我需要把一行地址分成几个部分。我找不到捕捉街道部分的方法,但不包括APP或APT单词(如果存在),如果存在,则捕捉后面的单词。
例如:
"5847A,rue-Principal APP A"应匹配:(5847,A,rue Principal,A)
"5847A,rue Prince Arthur APT 22"应匹配:(5847,A,rue王子Arthur,22)
"1111,舍伍德街"应匹配:(1111,Sherwood street,)
我在用PHP。
到目前为止,我所拥有的是:/^('d+)(.*), (.*)(?:APP|APT)(?:'s*(.*))?$/i
wich-wook与示例1和2。如果我试图通过添加?之后,第三个匹配包括单词APP或APT…
知道如何从匹配中排除可选和备选APP或APT单词吗?
谢谢
编辑:
我可以简化这个问题:如何重新生成字符串,以便匹配返回相同的字符串减去单词APP或APT(如果他出现在字符串中间)。
正如@MadaraUchiha所指出的,在地址上运行正则表达式是个坏主意,因为它们可以是任何格式。
如果你知道你有一致的地址,那么我想你可以使用regex:
^([0-9]+)([A-Z])?,'s(?:(.*?)'s(?:APP|APT)'s(.*)|(.*))$
以及替代品:
$1,$2,$3$5,$4
以下是它的表现。
它与您的非常相似(我更改了一些内容),并添加了或(|
)运算符来寻址没有APP
或APT
的第二类地址。
如果你想要一致的匹配次数,也许是这样?
^([0-9]*)([A-Z]?),((?:(?!'sAPP|'sAPT).)*)(?:'sAPP|'sAPT)?(.*)$
Regex101示例。
对于"简易"版本
var_dump(preg_replace ( "/ apt|app /i" , "" ,"5847A, rue Prince Arthur APT 22" ));
覆盖
输出
5847A, rue Prince Arthur 22
越难的版本,你就需要更多的上下文,比如为什么逗号看起来像这样。
硬版
([0-9]*)([a-z]?),(((?!app|apt).)*)(?:app|apt)?(.*)
似乎适用于您的测试用例
我认为这应该有效:
$pattern = "/'bAPP|APT'b/i";
$subject = "1111, Sherwood street";
echo preg_replace($pattern, "", $subject);