1

これは、私がスクレイピングした文字列のごく一部です:

SEPVALAjazz(音楽)SEPVALC5.59SEPVALAlatin(音楽)SEPVALAcountry(音楽)SEPVALC6.70SEPVALArock(音楽)SEPVALC5.89SEPVALAdance(音楽)SEPVALAworld(音楽)SEPVALC6.70

「SEPVALA」と「SEPVALC」の値を挿入するために、正規表現で文字列を操作しました。"SEPVALA""(music)SEPVALA"というパターンの間の文字列を、テキスト内のどこからでも削除したいと考えています。上記の例では、これにより「latin」と「dance」が削除されます。

望ましい結果は次のようになります。

SEPVALAjazz(音楽)SEPVALC5.59SEPVALAcountry(音楽)SEPVALC6.70SEPVALArock(音楽)SEPVALC5.89SEPVALAworld(音楽)SEPVALC6.70

現時点で実装しているコードは次のとおりです。

$pattern="/SEPVALA(.+?)\(music\)SEPVALA/";

$replacement="SEPVALA";

$newstring=preg_replace($pattern, $replacement, $originalstring );

ただし、正規表現エンジンが最初の「SEPVALA」を取得し、この時点から「(music)SEPVALA」までのすべてを削除するため、これは文字列をあま​​りにも多く削除します(そうあるべきです!) 「 (music) SEPVALA"は、問題のあるテキストを削除し、次の"SEPVALA"で停止してから、次の"(music) SEPVALA"の一致に進みます。またはこれを達成するための他の方法。どうもありがとう。

4

1 に答える 1

1

次のパターンを空の文字列に置き換えてみてください。

SEPVALA((?!SEPVAL[AC]).)+(?<=\(music\))(?=SEPVALA)

例: http://www.rubular.com/r/ZCfJQ4ey2O

説明: これは、 を照合してから、 または のいずれかが一致SEPVALAするまで一度に 1 文字ずつ照合することによって機能します。この時点で、 からまたはの直前に一致したので、前に一致した文字がであり、次の文字が であることを確認する必要があります。SEPVALASEPVALCSEPVALASEPVALASEPVALC(music)SEPVALA

完全なコード:

$pattern="/SEPVALA((?!SEPVAL[AC]).)+(?<=\\(music\\))(?=SEPVALA)/";
$replacement="";
$newstring=preg_replace($pattern, $replacement, $originalstring);
于 2012-09-17T21:39:09.983 に答える