2017-03-07 13 views
1

この正規表現に問題があります。 (https://regex101.com/r/vQLlyY/1preg_matchスラッシュを変数に格納したパターン

私のパターンが動作しているされています

あなたは、プロパティテキストは両方のこれらの文字列に抽出されていることをリンクに表示されます

(?<=Property:)(.*?)(?= \(Contact)|(?<=Property:)(.*?)(?= -)

:私は

Property: This is the property (Contact - Warren) 
Property: This is another property - Warren 

このパターンは次のように格納されます。

$this->rex["property"][2] = '/(?<=Property:)(.*?)(?= \(Contact)|(?<=Property:)(.*?)(?= -)/s' 

はその後、それがこのように抽出されます。この例では

foreach ($this->rex as $key => $value) { 
    if (isset($value[$provider])) { 
     preg_match_all($value[$provider], $emailtext, $matches); 
     if (!empty($matches[1][0])) { 
      $emaildetails[$key] = trim(preg_replace("/\r|\n/", "", $matches[1][0])); 
     } else { 
      $emaildetails[$key] = ""; 
     } 
    } 
} 

、$プロバイダ= 2

私がピックアップ(Contactにこのコードを取得することはできませんので、私の問題、私は確信しているがblackslashであります私がブラケットをエスケープする必要があるパターンの一部。他の多くのパターンが使用されているため、コードが動作することがわかります。また、パターンは次のように格納されている場合、このプロパティのテキストのために働く:だから

$this->rex["property"][2] = '/(?<=Property:)(.*?)(?= -)/s

、私はエスケープブラケットで正しくパターンを保存する、あるいは私の問題ということであるのですか?前もって感謝します!

+0

"連絡先"をキャプチャするか、それとも単にマッチングのために使用するかを明確にすることはできますか? –

+0

ちょうど一致する - 私は、プロパティの後に '(Contact')を持っています。 – Warren

+0

あなたが探している最終結果を理解しようとしています。このサンプルコードをこのエディタでラップしました:http://sandbox.onlinephpfunctions。 com/code/6a566fb5a0c6789d75a5fca24e4a6518cb1af561。print_rが出力すると思われるものであなたの答えを更新してください。 –

答えて

0

別々のキャプチャグループを使用しているため、異なるパスが異なる一致インデックスで終了しています。たとえば、最初の行(Contact - Warren)は一致結果をインデックス1に格納しています.2行目にはインデックス1に空の文字列があり、インデックス2には一致する結果が表示されます。

解決するにはこの問題では、キャプチャしていないグループを使用するか、式を書き換えて肯定的な先読みを使用することができます。前者の利点は、数量化を可能にすることです。後者のメリットは、マッチ結果全体が0マッチインデックスに終わらないことです。

非捕捉群の例:(?<=Property:)(.*?)\s*(?:\(Contact|-)https://regex101.com/r/vQLlyY/2

肯定先読みの例:(?<=Property:)(.*?)(?= \(Contact| -)https://regex101.com/r/vQLlyY/3

+0

リンクの代わりにコードを挿入してください。リンクが壊れていると、この回答は完全に役に立たなくなります! – Toto

+0

私の謝罪は、更新されました。 –