正则表达式包括换行符

时间:2013-08-20 15:45:50

标签: php regex

我有这个简单的文本来解析正则表达式:

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 个答案:

答案 0 :(得分:2)

对于PCRE(Perl兼容正则表达式)的味道(由PHP的preg_*函数使用):

           /^([^:]+:)\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中的字符串你真的输入换行符然后if you write \n (but not \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'

答案 1 :(得分:2)

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

/^T[^T]+/

这匹配T和非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 demo

答案 2 :(得分:1)

如果您想匹配新的线路使用:

\s*

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

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

    • \r是一个回车

    • \n是换行符

要在PHP中实现此功能,请使用preg_match

答案 3 :(得分: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