Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式包含换行符_Php_Regex - Fatal编程技术网

Php 正则表达式包含换行符

Php 正则表达式包含换行符,php,regex,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) 11

我要通过正则表达式解析以下简单文本:

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解析以包含换行符?

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

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

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

    • \r
      是回车

    • \n
      是一个换行符

要在PHP中实现这一点,请使用PCRE(Perl兼容正则表达式)风格(由PHP的
preg.*
函数使用):

将锚点放在字符串的开头,并显式地命名换行符(LF;
\n

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

(?>\r\n|\n|\r)
还有更多,您甚至可以配置正则表达式引擎,然后使用
\R
换行。您可以在以下内容中找到详细概述:

但是,要在PHP中使用这些正则表达式,您需要小心使用单引号字符串,否则必须对每个
\
进行转义,才能不逐字输入换行符,因为在PHP中的双引号字符串中,您实际上输入了换行符。所以请注意这些引语

例如:

$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'

输入数据有点奇怪,但您可以依赖这样一个事实,即您的特定示例中没有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]);

.

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

<?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);

?>
要仅获取要使用的第一条记录,请执行以下操作:

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

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
)
 T. Condesa:(52) (555) 1111 2222

只需匹配
\s*
而不是
即可匹配第一行后面的换行符。
\s
包括
\r
\n
因此您只能编写
\s*
。-另请参见:当像这样显式匹配换行符时,我建议始终使用
\r?\n
来支持不同的换行符formats@SmokeyPHP:那么我建议
(?>\r\n |\n |\r)
)但这只是说
\r?\n
…不,你不会将单个
\r
与你的组合匹配。同样,回溯也是不同的。谢谢,很好地满足了目的,但是如果案例是T.Texas:(00)(000)0000 0000T.@Cruising2hell在这种情况下,您可以尝试
preg_match(/T\(?:[^T][^.])+/,$str,$res)请参阅。如果您不想得到一个更适合但也更复杂的“刚性”图案,那么这仍然是一个简单的图案。:)
 T. Condesa:(52) (555) 1111 2222