在单词之间获取字符串,并且一个单词是可选的

时间:2022-07-04 21:38:02

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
        )

)