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
preg.*
函数使用):
将锚点放在字符串的开头,并显式地命名换行符(LF;\n
)
此\n
换行符专门用于unix。所以这一定不是字符串中的换行符。因此,为了支持CRLF、LF和CR序列(即Dos、Unix和Mac),您可以使用
(?>\r\n|\n|\r)
还有更多,您甚至可以配置正则表达式引擎,然后使用\R
换行。您可以在以下内容中找到详细概述:
\
进行转义,才能不逐字输入换行符,因为在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