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,我试图从字符串中搜索三段数据,它们是: first name, space ,last name (?=[A-Z][a-z]+\s[A-Z][a-z]+) //AND first name ,space ,last name ,and suffix (?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+) //AND, age (?=[0-9]{2}) 从几个教程中,我看到了以下三种模式: (?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-

我试图从字符串中搜索三段数据,它们是:

first name, space ,last name  (?=[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND
first name ,space ,last name ,and suffix (?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND,
age   (?=[0-9]{2})
从几个教程中,我看到了以下三种模式:

(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2})
一起应该是我的解决方案,但它不起作用。。。。任何建议…(这是一个php脚本,我使用preg_match_all)

我的剧本:

$content = file_get_contents('http://www.somesite.com');
$pattern = '/(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2}) /';
if(preg_match_all($pattern,$content,$matches))
{
// has the pattern, do something
//$matches has all the matches from preg_match

  }

您要查找的是OR运算符,而不是AND:

[A-Z][a-z]+\s[A-Z][a-z]+|[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+|[0-9]{2}
如果单词之间可能有多个空格字符,请确保量化
\s

[A-Z][a-z]+\s+[A-Z][a-z]+|[A-Z][a-z]+\s+[A-Z][a-z]+\s+[A-Z][a-z]+|[0-9]{2}

如果要查找精确匹配,请不要忘记锚定(
^
$
)。

您可以使用非捕获组
(?:…)
和问号使组成为可选组:

[A-Z][a-z]+\s[A-Z][a-z]+(?:\s[A-Z][a-z]+(?:\s[0-9]{2,3})?)?
如果要提取数据,使用命名捕获是一种干净的方法:

$pattern = <<<'LOD'
~
(?<first_name>[A-Z][a-z]+)
\s+
(?<last_name>[A-Z][a-z]+)
(?:
    \s+ (?<suffix>[A-Z][a-z]+)
    (?: \s+ (?<age> [0-9]{2,3}) )?
)?
~x
LOD;

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo '<br/>' . $match['first_name'] . ', ' . $match['last_name'];
} 
$pattern=

您可以使用类似于

的工具测试您的正则表达式,当您知道某些组件必须存在,但您不知道它们将以什么顺序出现时,多重前瞻技巧适用。在强制执行强密码策略的正则表达式中最常见

你的问题要简单得多;组件的顺序始终相同,但最后一个是可选的。这要容易得多:

'/\b([A-Z][a-z]*)\s+([A-Z][a-z]*)(?:\s+([0-9]{2}))?\b/'

第一个名字在第1组中,最后一个名字在第2组中,如果有后缀,你可以在第3组中找到。

请发布你的脚本字符串“its[sic]not working”在PHP中不是内置的错误消息。我发布了我的脚本…我的错误控制台中没有收到错误。。。
'/\b([A-Z][a-z]*)\s+([A-Z][a-z]*)(?:\s+([0-9]{2}))?\b/'