2016-08-19 6 views
0

を含む文字列と抽出サブストリングの配列から求める値Iはname (some title), address (may contain commas)PHP - その値

例からなる文字列から名前を抽出したい:

John Doe PhD., 25 Oak Rd, Ridgeville, WA, USA 
Peter Smith PhD. and Hannah Smith, 55 Riverside Ave, Alice Springs, NT, Australia 
John Miles, BA, PhD., 152 Rain Rd, Copper Mines, Canada 
Cool Company, Inc., 152 Great Rd, NZ 

は、これらの線の各々が格納されていると言います変数$stringにあります。

予想される出力:私は何

John Doe PhD. 
Peter Smith PhD. and Hannah Smith 
John Miles, BA, PhD. 
Cool Company, Inc. 

- 私はタイトル

$titles = array("PhD.", "MA", "MSc", "BA", "Inc."); 

の配列を用意し、$titlesのいずれかのために$stringを検索したいです。

問題は、文字列の最後のタイトルを検索する必要があります(逆方向検索のようなものです)。そのタイトルを含む部分文字列(文字列の先頭からすべて)を抽出する必要があります。次のカンマ(2行目 - カップル参照)まで終わるので、私は全体の名前(カップルの場合は名前)を持っています。

+0

これらの文字列に対して期待される出力を共有できますか? –

+0

それぞれの文字列を '、'で分割して配列にすることができます。次に配列をループして、サブ文字列内のタイトルを見つけることができるかどうかを確認します。見つかった場合は、同じ文字列を取得します。しかし、これらの文字列を大量に取得すると、パフォーマンス上の問題になります。 –

+0

@Sameer KIは既にこれを行っていますが、最後のタイトルを簡単に見つけることができないため、ソリューションを提供しません。名前にカンマを入れることができるので、 '、'で分割すると解が得られません。 –

答えて

0

Okey、これはあなたを助けるかもしれません。以下のコードを試してください。コメントでコードを試しました。

$str = "Peter Smith PhD. and Hannah Smith, 55 Riverside Ave, Alice Springs, NT, Australia"; 
$substring = getSubstring($str); 
echo $substring; 
function getSubString($str) { 

    $titles = array("PhD.", "MA", "MSc", "BA", "Inc."); 
    foreach ($titles as $key => $val) { 

    //Search for title in string 
    if(strpos($str, $val)) { 

     //if found then find the first occurance of the title in string in reverse 
     $lastTitlePosition = strrpos($str, $val, 0); 

     //then find the next comma after title 
     $commaPositionAfterTitle = strpos($str, ',', $lastTitlePosition); 

     //then return substring till that comma of substring where title found 
     return substr($str,0,$commaPositionAfterTitle); 
    } else { 
     return "not found"; 
    } 
    } 
} 
+0

空の出力 - http://ideone.com/7SlHdDを参照してください –

+0

私のコードを更新した '$ substring'をエコーするのを忘れました。今すぐチェックしてください。 –

+0

それは、(i)最初のタイトルが見つからないときに機能が停止しているようです。 (ii)タイトルが見つかった場合、そのタイトルが最後のタイトルかどうかをテストしません(後でカンマで区切ったタイトルがあります)。 - http://ideone.com/LHFcJ7を参照してください。 –