我有这个简单的文本来解析正则表达式:
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解析包含换行符?
答案 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]);
答案 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