Php 正则表达式:如何捕获行的开头、模式和结尾?
以下是一些例子:Php 正则表达式:如何捕获行的开头、模式和结尾?,php,regex,Php,Regex,以下是一些例子: 一些文本A 一些文本A 8:00-19:00 8:00-19:00 一些文本A 8:00-19:00一些文本B 对于上述每个案例,我需要捕获(如果可能): 时间(8:00-19:00) 开头(一些文本A) 结尾(一些文本B) 有了这个模式#^(.*)(\d{1,2}:\d{2}-\d{1,2}:\d{2})?$#,我可以捕获(来自示例2): 一些文本A 8:00-19:00 但我无法通过在模式末尾添加(.*)或(.*)来捕获行的其余部分 你能帮我吗?谢谢大家! 我认为您
一些文本A
一些文本A 8:00-19:00
8:00-19:00
一些文本A 8:00-19:00一些文本B
- 时间(
)8:00-19:00
- 开头(
)一些文本A
- 结尾(
)一些文本B
#^(.*)(\d{1,2}:\d{2}-\d{1,2}:\d{2})?$#
,我可以捕获(来自示例2):
一些文本A
8:00-19:00
(.*)
或(.*)
来捕获行的其余部分
你能帮我吗?谢谢大家!
我认为您的主要问题是,您通过在后面添加?
使这组数字成为可选的(我认为您不希望这样)
<?php
$pattern = <<<REGEX
/
(?:
(.*)?\s* #Prefix with trailing spaces
(
(?:\d{1,2}:\d{1,2}-?) #(dd:dd)-?
{2} #2 of those
) #(The time)
\s*(.*) #Trailing spaces and suffix
|
([a-zA-Z ]+) #Either that, or just text with spaces
)
/x
REGEX;
preg_match($pattern, "Some text A 8:00-19:00 Some text B", $matches);
print_r($matches);
这适用于我/^(.*)(\d{1,2}:\d{2}-\d{1,2}:\d{2})?(.*)$/
:
<?
$str = "Some text A 8:00-19:00 Some text B";
$pat = "/^(.*) ?(\d{1,2}:\d{2}-\d{1,2}:\d{2}) ?(.*)$/";
if(preg_match($pat, $str, $matches)){
/*
Cases 2, 3 and 4
Array
(
[0] => Some text A 8:00-19:00 Some text B
[1] => Some text A
[2] => 8:00-19:00
[3] => Some text B
)
*/
}else{
/* Case 1 */
}
?>
好的。。。我不清楚到底是什么情况
我相信您希望匹配3个可选组(可能会匹配“格式错误”的输入,除非您提供了不希望匹配的案例场景)
尽管在案例1中,$matches[0]和$matches[3]中出现了“Some text A”,而不是$matches[1],但这在所有示例中都有效
/^([A-Za-z ]*?)([0-2]{0,1}[0-9]\:[0-6][0-9]\-[0-2]{0,1}[0-9]\:[0-6][0-9])?([A-Za-z ]*?)$/
使用如何
输出:
Array
(
[0] => Some text A
)
Array
(
[0] => Some text A
[1] => 8:00-19:00
)
Array
(
[0] => 8:00-19:00
)
Array
(
[0] => Some text A
[1] => 8:00-19:00
[2] => Some text B
)
我知道我应该使用\d{1,2}:\d{1,2}-\d{1,2}:\d{1,2}
,但我很懒,想把模式缩短一些:ddos与某些文本A
(示例1)不匹配,或者是这样吗?没有测试,谢谢你。正如Kaii所说,它与示例2、3和4匹配,但与示例1不匹配。我试图添加一个?
四元数,但是没有任何匹配项了……当然,您也可以轻松地将这个角落的情况作为正则表达式的一部分来处理;-)+1嗯,这适用于非重音字符。我是法国人,我刚用c-cedilla(ç
)…:-)测试过。我不明白为什么正则表达式引擎不能将某些文本B
与(.*)
匹配到模式的末尾。有人能解释一下原因吗?没有将匹配分为1-3组,只给出完整的匹配行,这不是OP想要的。这适用于案例2、3和4。但不是第一个:)如果不匹配,请抓取整个输入,对不起,我完全忘了测试第一个案例。正如@robinr所说的,如果没有匹配项,那么您只需抓住整个字符串(我编辑了这个)。诚然,发布的纯正则表达式解决方案比这个要好。在您给出的这四个示例中,您需要捕获它们吗?或者仅仅是那些有日期时间的?这“一些文本a”和“一些文本B”是一些必须精确的值,或者它可能会变化?我的意思是,如果你只需要在有特定值时匹配,或者如果它必须在时间前后匹配任何值。Tivi:是的,我需要捕获所有这些值,即使是那些没有时间的(在本例中,将捕获整行内容)。rcdmk:时间前后的文本可能会有所不同。我需要在有时间时捕获它们(或不,正如Tivie所说)。可能正则表达式不是用于此作业的正确工具。这适用于给定的示例输入,但在时间前后的文本包含小数时不起作用。。(例如,在9:00-11:00的某个地方遇见3个人
)你没有指定文本也有数字…所以你的文本可以有任何类型的字符?!所有的字符?像#&´´´~@等等?不,OP没有-我只是想添加它作为你的正则表达式的备注/限制。谢谢你的回答。我接受了Gordon的答案,因为它在我现有的代码中更合适。你的答案也可以适用:)
Array
(
[0] => Some text A
)
Array
(
[0] => Some text A
[1] => 8:00-19:00
)
Array
(
[0] => 8:00-19:00
)
Array
(
[0] => Some text A
[1] => 8:00-19:00
[2] => Some text B
)