0

以下は2つのポケットベルアラートメッセージです。正規表現を使用して2番目のメッセージのアドレスとジョブの詳細をphp文字列に抽出しようとしています...

次に、2つのメッセージ例を示します。

0571040 15:45:21 30-04-12  @@ALERT F546356345 THEB8 STRUC1 SMELL OF SMOKE AND ALARM OPERATING 900 SOME ROAD SOMESUBURB /CROSSSTREET1 RD //CROSSTREET2 AV M 99 A1 (429085) CTHEB CBOROS PT28 [THEB]

0571040 15:45:21 30-04-12  @@ALERT F546356345 THEB8 STRUC1 SMELL OF SMOKE AND ALARM OPERATING 4 / 900 SOME ROAD SOMESUBURB /CROSSSTREET1 RD //CROSSTREET2 AV M 99 A1 (429085) CTHEB CBOROS PT28 [THEB]

2番目のアドレスの先頭に4/900があるか、ユニット4/900と表示されていることに気付くでしょう...そしてこれが私の問題の始まりです!アドレスにはさまざまな形式があり、「通常の」番号付きアドレスと「Corner Of」アドレスを別の場所に並べ替えていますが、900に4がないこのアドレスは困惑しています。余分な/は私の表現を台無しにしました...助けて!:)

私の表現では、最初のスラッシュを最初の交差点として使用しますが、上の2番目のケースでは、最初の/がアドレスの一部になります...以下はこれまでのところです。

function get_string_between2($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

$fullstring = "$rawPage";

if ( strpos($fullstring, ' STRUC1 ')!== false )
{
$parsed = get_string_between2($fullstring, "STRUC1", "/");
}
$input = "$parsed";
preg_match('/([^0-9]+)(.*)/', $input, $matches);

$jobdet = "$matches[1]";

$jobadd = "$matches[2]";

これで、これはトップメッセージに対して正常に機能し、結果として次のようになります。

$jobdet =  SMELL OF SMOKE AND ALARM OPERATING

$jobadd =  900 SOME ROAD SOMESUBURB

$firstcrossstreet = /CROSSSTREET1 RD 

$secondcrossstreet = //CROSSSTREET2 AV 

2番目のメッセージの場合、この結果はすべて間違っています。

$jobdet =  SMELL OF SMOKE AND ALARM OPERATING

$jobadd =  4 

$firstcrossstreet = / 900 SOME ROAD SOMESUBURB /CROSSSTREET1 RD 

$secondcrossstreet = //CROSSSTREET2 AV 

/が原因であることはわかっていますが、どちらの場合も処理する式を作成するにはどうすればよいですか?

4

1 に答える 1

0

正規表現では、スラッシュが式の一部として使用されるため、スラッシュをエスケープする必要があります。典型的な式は次のようになります。

/式/修飾子

式は正規表現であり、修飾子は実行と結果の型を変更します。例えば:

/<[^>]+>/g

これにより、すべての HTML タグが文字列で返されます。正規表現は <[^>]+> で、2 つのスラッシュの間にあります。したがって、スラッシュ - / - をエスケープして、リテラル文字列のスラッシュを実現します。

于 2012-05-01T01:17:15.603 に答える