我正在尝试从以下内容中提取suburb name
:
12 street name, suburb name, CTG 1234
在 PHP 中使用正则表达式。
- 街道和郊区名称都可以是任意数量的单词。
- CTG是状态的首字母缩写,总是已知的,总是相同的。
- 后跟 4 位邮政编码。
我想出了以下正则表达式,但无法完全抓住我想要的东西。
/['.|,]+'s*(.*?)['.|,]+*'s*CTG'd{4,4}$/i
哪里:
-
CTG'd{4,4}$
是从左边找到邮政编码和州。 -
['.|,]*'s*
是在街道和郊区名称之后匹配至少一个点或逗号,后跟零个或多个空格。 -
(.*?)
是抓住我的目标。 郊区名称。 -
*?
所以它将是不贪婪的。
上面在 preg_match() 中使用,任何给定的主题返回一个匹配数组,其中:
-
arrey[0]
= 整个匹配 -
arrey[1]=12
= 街道名称、郊区名称
但是,如果在 http://www.regexplanet.com 尝试,它似乎工作正常。
您可以使用以下命令获取郊区名称:
$str = '12 street name, suburb name, CTG 1234';
$pattern = '/[^.,]++(?=[.,]'s*CTG 'd{4}$)/';
preg_match($pattern, $str, $result);
echo $result[0];
为了仅匹配郊区名称,我使用前瞻断言(?=...)
,该断言仅执行检查而不记录匹配项。
图案详情:
/
[^.,]++ # all that is not a . or a , one or more times (possessive)
(?= # open lookahead assertion (means "followed by")
[.,]'s* # a . or a , with optional white characters
CTG 'd{4}$ # CTG, a space, four digits, end of string
) # close the lookahead
/
^(.*)['.,]'s+(.*)['.,]'s+CTG's+('d+)$
提取匹配组号试试这个。2.
看起来您错过了 CTG 和数字之间的空格(句点也不需要在括号内转义,也不需要 OR 管道)。这应该适合您的需求:
/.*[.,]+'s*(.*)[.,]+'s*CTG's*'d{4,4}$/i
您可以在 PHP Live Regex 上看到带有示例文本的上述模式