2

我有这个简单的文本可以通过正则表达式解析:

T. Condesa:
(52) (555) 1111 2222T. Polanco:
(52) (55) 1111-2222T. San Ángel:
(52) (55) 1111-3333T. Paseo Arcos Bosques:
(52) (55) 2222-3333T. Antara:
(52) (55) 1111-1111T. Interlomas:
(52) (55) 1111-1111T. Prado Norte:
(52) (55) 1111 1111T. Reforma:

现在在这里我只想要第一个电话号码 -

T. Condesa:(52) (555) 1111 2222

我们如何使用 PHP 进行解析以包含换行符?

4

4 回答 4

2

对于 PCRE(Perl 兼容正则表达式)风格(由 PHPpreg_*函数使用):

           /^([^:]+:)\n([ ()0-9-]+)/
            ^        ^^
            |     line-break
            |
  Begin of string anchor

将锚点放在字符串的开头并明确命名换行符(LF; \n)。

\n换行符专门针对 unix。所以这不能是你的字符串中的换行符。因此,为了还支持 CRLF、LF 和 CR 序列(即 Dos、Unix 和 Mac),您可以使用

(?>\r\n|\n|\r)

还有更多,您甚至可以配置正则表达式引擎,然后仅\R用于换行符。您可以在以下位置找到详细概述:

要在 PHP 中使用这些正则表达式,您需要小心并使用单引号字符串,否则您必须转义每个字符串\以不逐字输入换行符,因为在 PHP 中的双引号字符串中,如果您编写\n(但不是\R。因此,请注意引号。

例子:

$subject = 'T. Condesa:
(52) (555) 1111 2222T. Polanco:
(52) (55) 1111-2222T. San Ángel:
(52) (55) 1111-3333T. Paseo Arcos Bosques:
(52) (55) 2222-3333T. Antara:
(52) (55) 1111-1111T. Interlomas:
(52) (55) 1111-1111T. Prado Norte:
(52) (55) 1111 1111T. Reforma:';

preg_match('/^([^:]+:)\R([ ()0-9-]+)/', $subject, $matches)
  && vprintf('%2$s %3$s', $matches); # prints 'T. Condesa: (52) (555) 1111 2222'
于 2013-08-20T16:00:25.503 回答
2

输入数据有点奇怪,但您可以依靠您的特定示例没有 T 的事实,并通过简单的方式获得所需的结果:

/^T[^T]+/

这匹配 aT和尽可能多的非T字符,直到下一个T。这是代码:

$str = 'T. Condesa:
        (52) (555) 1111 2222T. Polanco:
        (52) (55) 1111-2222T. San Ángel:
        (52) (55) 1111-3333T. Paseo Arcos Bosques:
        (52) (55) 2222-3333T. Antara:
        (52) (55) 1111-1111T. Interlomas:
        (52) (55) 1111-1111T. Prado Norte:
        (52) (55) 1111 1111T. Reforma:';
preg_match("/^T[^T]+/", $str, $res);
print_r($res[0]);

Ideone 演示

于 2013-08-20T16:02:19.967 回答
1

如果要匹配新行,请使用:

\s*

例如一个非常简单的正则表达式来匹配 T. Condesa 和它下面的数字:

T. Condesa:\s*\(52\) \(555\) 1111 2222
  • \s是空格,包括:

    • \r是回车

    • \n是换行符

要在 PHP 中实现这一点,请使用preg_match

于 2013-08-20T15:49:48.500 回答
0

在这里,我将电话号码和电话号码的描述捕获为单独的字符串,使用preg_match_all. 最后,我们有一个包含电话号码的数组。下面显示了如何捕获任何电话号码并省略换行符。

<?php

$string = "T. Condesa:
(52) (555) 1111 2222T. Polanco:
(52) (55) 1111-2222T. San Ángel:
(52) (55) 1111-3333T. Paseo Arcos Bosques:
(52) (55) 2222-3333T. Antara:
(52) (55) 1111-1111T. Interlomas:
(52) (55) 1111-1111T. Prado Norte:
(52) (55) 1111 1111T. Reforma:";

$pattern = "!(T[^:]+):\s+([)(\s\d-]+\d{4})!";

preg_match_all($pattern,$string,$matches);

$Tel = array();

foreach($matches[1] as $key=>$desc){

  $Tel[$desc]=$matches[2][$key];

}

print_r($Tel);

?>

输出

Array
(
    [T. Condesa] => (52) (555) 1111 2222
    [T. Polanco] => (52) (55) 1111-2222
    [T. San Ãngel] => (52) (55) 1111-3333
    [T. Paseo Arcos Bosques] => (52) (55) 2222-3333
    [T. Antara] => (52) (55) 1111-1111
    [T. Interlomas] => (52) (55) 1111-1111
    [T. Prado Norte] => (52) (55) 1111 1111
)

要仅获取您将使用的第一条记录:

 echo "T. Condesa:".$Tel['T. Condesa'];

输出

 T. Condesa:(52) (555) 1111 2222
于 2013-08-20T17:11:29.997 回答