PHP Regular从字符串中提取部分

时间:2011-10-27 16:08:42

标签: php regex

我在C#中创建了一个正则表达式,但现在我在尝试用PHP运行时遇到了困难。我推测他们的工作方式相同,但显然不是。有谁知道下面需要改变什么才能让它发挥作用?

我们的想法是确保字符串的格式为“Firstname Lastname(Company Name)”,然后提取字符串的各个部分。

C#代码:

string patternName = @"(\w+\s*)(\w+\s+)+";
string patternCompany = @"\((.+\s*)+\)";
string data = "Firstname Lastname (Company Name)";

Match name = Regex.Match(data, patternName);
Match company = Regex.Match(data, patternCompany);

Console.WriteLine(name.ToString());
Console.WriteLine(company.ToString());
Console.ReadLine();

PHP代码(未按预期工作):

$patternName = "/(\w+\s*)(\w+\s+)+/";
$patternCompany = "/\((.+\s*)+\)/";
$str = "Firstname Lastname (Company Name)";

preg_match($patternName, $str, $nameMatches);
preg_match($patternCompany, $str, $companyMatches);

print_r($nameMatches);
print_r($companyMatches);

3 个答案:

答案 0 :(得分:2)

似乎在这里工作。您应该意识到,当您在正则表达式中捕获匹配项时,PHP生成的数组将包含与整个模式匹配的完整字符串以及每个单独的捕获组。

对于您的姓名/公司名称,您需要使用

$nameMatches[1] -> Firstname
$nameMatches[2] -> Lastname
and
$companyMatches[1] -> Company Name

这是捕获组匹配的内容。两者的[0]元素都是整个字符串。

答案 1 :(得分:1)

可能是因为你使用的是双引号。 PHP可能会拦截您的转义序列并将其删除,因为它们无法识别。

答案 2 :(得分:1)

您的模式执行似乎可以提取您想要的信息。尝试用:

替换两个print_r()行
print "Firstname: " . $nameMatches[1] . "\n";
print "Lastname: " . $nameMatches[2] . "\n";
print "Company Name: " . $companyMatches[1] . "\n";

此输出有什么问题吗?

Firstname: Firstname 
Lastname: Lastname 
Company Name: Company Name