I have a lot of strings like this:
我有很多像这样的字符串:
"Dirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs"
"Dirección: AV. RIVADAVIA 11441 Horario de atención: 08:02 a 21:00 hs"
"Dirección: AV. RIVADAVIA 11442 Horario de atención: 08:03 a 21:00 hs"
"Dirección: AV. RIVADAVIA 11443 Horario de atención: 08:04 a 21:00 hs"
"Dirección: xxxxx Horario de atención: 08:05 a 21:00 hs"
The first problem: I need to get the text that is where the "xxxxx" are placed. It can be one word and maybe more, its an address.
第一个问题:我需要获取放置“xxxxx”的文本。它可以是一个词,也许更多,它是一个地址。
The second problem: the text after the address is optional, so I can have something like this
第二个问题:地址后面的文字是可选的,所以我可以这样做
"Dirección: CALLE 137 E/ 32 Y 32BIS"
How can I get the address from my strings?
如何从字符串中获取地址?
3 个解决方案
#1
1
You can use a regex with lookaround assertions. For example:
您可以使用带有环绕声断言的正则表达式。例如:
<?php
$strings = <<<EOF
Dirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs
Dirección: AV. RIVADAVIA 11441 Horario de atención: 08:02 a 21:00 hs
Dirección: AV. RIVADAVIA 11442 Horario de atención: 08:03 a 21:00 hs
Dirección: AV. RIVADAVIA 11443 Horario de atención: 08:04 a 21:00 hs
Dirección: xxxxx Horario de atención: 08:05 a 21:00 hs
EOF;
preg_match_all('/(?<=Dirección:\s).*(?=Horario de atención)/', $strings, $matches);
print_r($matches);
Yields:
产量:
Array
(
[0] => Array
(
[0] => AV. RIVADAVIA 11440
[1] => AV. RIVADAVIA 11441
[2] => AV. RIVADAVIA 11442
[3] => AV. RIVADAVIA 11443
[4] => xxxxx
)
)
Hope this helps :)
希望这可以帮助 :)
#2
0
You can use a tempered greedy token to obtain what you need:
你可以使用一个驯化的贪婪令牌来获得你需要的东西:
Dirección:\s*((?:(?!Horario de atención:).)*)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
See regex demo, the result is in Group 1:
请参阅regex演示,结果在第1组中:
$re = '~Dirección:\s*((?:(?!Horario de atención:).)*)~u';
$str = "Dirección: CALLE 137 E/ 32 Y 32BIS\nDirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
See demo.
见演示。
The tempered greedy token (?:(?!Horario de atención:).)*
matches anything but a symbol that is starting a substring Horario de atención:
.
脾气暴躁的贪婪令牌(?:(?!Horariodeatención:)。* *匹配任何东西,但是起始子串Horariodeatención:
#3
0
Based on your example; you just need to look for the zipcode in the address as the limiter. For example
根据你的例子;你只需要在地址中查找邮政编码作为限制器。例如
<?php
$strings = <<<EOF
Dirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs
Dirección: AV. RIVADAVIA 11441 Horario de atención: 08:02 a 21:00 hs
Dirección: AV. RIVADAVIA 11442 Horario de atención: 08:03 a 21:00 hs
Dirección: AV. RIVADAVIA 11443 Horario de atención: 08:04 a 21:00 hs
Dirección: xxxxx Horario de atención: 08:05 a 21:00 hs
EOF;
preg_match_all('/Dirección:\s(.*\d{5})/', $strings, $matches);
print_r($matches);
Results in item #2 in the array to have the data you need:
结果在数组中的第2项中获得所需的数据:
Array
(
[0] => Array
(
[0] => Dirección: AV. RIVADAVIA 11440
[1] => Dirección: AV. RIVADAVIA 11441
[2] => Dirección: AV. RIVADAVIA 11442
[3] => Dirección: AV. RIVADAVIA 11443
)
[1] => Array
(
[0] => AV. RIVADAVIA 11440
[1] => AV. RIVADAVIA 11441
[2] => AV. RIVADAVIA 11442
[3] => AV. RIVADAVIA 11443
)
)
#1
1
You can use a regex with lookaround assertions. For example:
您可以使用带有环绕声断言的正则表达式。例如:
<?php
$strings = <<<EOF
Dirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs
Dirección: AV. RIVADAVIA 11441 Horario de atención: 08:02 a 21:00 hs
Dirección: AV. RIVADAVIA 11442 Horario de atención: 08:03 a 21:00 hs
Dirección: AV. RIVADAVIA 11443 Horario de atención: 08:04 a 21:00 hs
Dirección: xxxxx Horario de atención: 08:05 a 21:00 hs
EOF;
preg_match_all('/(?<=Dirección:\s).*(?=Horario de atención)/', $strings, $matches);
print_r($matches);
Yields:
产量:
Array
(
[0] => Array
(
[0] => AV. RIVADAVIA 11440
[1] => AV. RIVADAVIA 11441
[2] => AV. RIVADAVIA 11442
[3] => AV. RIVADAVIA 11443
[4] => xxxxx
)
)
Hope this helps :)
希望这可以帮助 :)
#2
0
You can use a tempered greedy token to obtain what you need:
你可以使用一个驯化的贪婪令牌来获得你需要的东西:
Dirección:\s*((?:(?!Horario de atención:).)*)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
See regex demo, the result is in Group 1:
请参阅regex演示,结果在第1组中:
$re = '~Dirección:\s*((?:(?!Horario de atención:).)*)~u';
$str = "Dirección: CALLE 137 E/ 32 Y 32BIS\nDirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
See demo.
见演示。
The tempered greedy token (?:(?!Horario de atención:).)*
matches anything but a symbol that is starting a substring Horario de atención:
.
脾气暴躁的贪婪令牌(?:(?!Horariodeatención:)。* *匹配任何东西,但是起始子串Horariodeatención:
#3
0
Based on your example; you just need to look for the zipcode in the address as the limiter. For example
根据你的例子;你只需要在地址中查找邮政编码作为限制器。例如
<?php
$strings = <<<EOF
Dirección: AV. RIVADAVIA 11440 Horario de atención: 08:01 a 21:00 hs
Dirección: AV. RIVADAVIA 11441 Horario de atención: 08:02 a 21:00 hs
Dirección: AV. RIVADAVIA 11442 Horario de atención: 08:03 a 21:00 hs
Dirección: AV. RIVADAVIA 11443 Horario de atención: 08:04 a 21:00 hs
Dirección: xxxxx Horario de atención: 08:05 a 21:00 hs
EOF;
preg_match_all('/Dirección:\s(.*\d{5})/', $strings, $matches);
print_r($matches);
Results in item #2 in the array to have the data you need:
结果在数组中的第2项中获得所需的数据:
Array
(
[0] => Array
(
[0] => Dirección: AV. RIVADAVIA 11440
[1] => Dirección: AV. RIVADAVIA 11441
[2] => Dirección: AV. RIVADAVIA 11442
[3] => Dirección: AV. RIVADAVIA 11443
)
[1] => Array
(
[0] => AV. RIVADAVIA 11440
[1] => AV. RIVADAVIA 11441
[2] => AV. RIVADAVIA 11442
[3] => AV. RIVADAVIA 11443
)
)