2011-10-27 11 views
0

C#で正規表現を作成しましたが、PHPで実行しようとすると苦労しています。彼らは同じことをするだろうと思ったが、明らかにそうではなかった。誰でも下に変更して動作させる必要があることを知っていますか?PHP文字列の正規の部分を抽出する

文字列の形式が「名字(会社名)」であることを確認し、文字列のさまざまな部分を抽出することです。

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); 

答えて

1

あなたは二重引用符を使用しているので、それは可能性があります。 PHPが認識できないため、エスケープシーケンスを傍受している可能性があります。

+1

: '単一のように引用符で囲まれた文字列は、他の文字をエスケープすると、バックスラッシュも出力されます。 " - ただし、これはベストプラクティスの点では有効な点です。 – DaveRandom

2

ここで動作するようです。あなたが認識すべきことは、正規表現でマッチをキャプチャしているときに、PHPが生成する配列には、パターン全体と一致した完全な文字列と個々のキャプチャグループの両方が含まれることです。お名前/会社名については

、あなたはキャプチャグループによってマッチ得たものである

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

を使用する必要があるだろう。両方の要素の[0]が文字列全体です。

1

あなたのパターンdoは、必要な情報を抽出するように見えます。 2つのprint_r()行を次のように置き換えてください:

print "Firstname: " . $nameMatches[1] . "\n"; 
print "Lastname: " . $nameMatches[2] . "\n"; 
print "Company Name: " . $companyMatches[1] . "\n"; 

この出力には何か問題はありますか? (http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double)PHPマニュアルより]

Firstname: Firstname 
Lastname: Lastname 
Company Name: Company Name 
関連する問題